Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Напечатать файл построчно

15K
29 июля 2008 года
like-nix
46 / / 27.06.2007
Подскажите пож как правильно вывести построчно.
Операция с файловым дескриптором обязательна.
Можно конечно самому искать конец строки, но меня интересует почему приведенный ниже код не работает?

Код:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdio.h>

#define MAXLINE 4096
int main(int argc, char * argv[])
{
  int fd  = open ("temp_file.txt", O_CREAT | O_RDWR | O_TRUNC);
  int k;
  for (k = 0 ; k < 100; ++k)
    write(fd,"Hello world!!!\n" , sizeof("Hello world!!!\n"));

  FILE * std_file = fdopen(fd, "r");
  std_file == NULL ? exit(0): 0;

  fseek ( std_file , 0 , SEEK_SET );

  char buf[MAXLINE];
  while( fgets(buf, MAXLINE, std_file)!=NULL)
    fputs(buf, stdout);
  return 0;
}
1.9K
29 июля 2008 года
max_dark
256 / / 11.11.2005
sizeof("Hello world!!!\n") учитывает нуль-символ(\0) в конце строки
Поэтому он(нуль-символ) так же записывается в файл. Это легко проверить в любом hex-редакторе.
Исправить положение можно либо
 
Код:
for (k = 0 ; k < 100; ++k)
    write(fd,"Hello world!!!\n" , sizeof("Hello world!!!\n")-1);
либо
 
Код:
for (k = 0 ; k < 100; ++k)
    write(fd,"Hello world!!!\n" , strlen("Hello world!!!\n"));
15K
29 июля 2008 года
like-nix
46 / / 27.06.2007
Так точно )))
Спасибо
255
30 июля 2008 года
Dart Bobr
1.4K / / 09.04.2004
Для строк никогда не используй sizeof, а только strlen. Почему?
А потому-что если у тебя будет обьявлена строка в виде char *, то sizeof вернет размер указателя, а не строки.
14
30 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: Dart Bobr
Для строк никогда не используй sizeof, а только strlen. Почему?
А потому-что если у тебя будет обьявлена строка в виде char *, то sizeof вернет размер указателя, а не строки.



Да, однажды наткнулся на пример построения TreeView как в проводнике, от программистки (имя не вспомню, но пример есть в MSDN) Microsoft. Пример от 98х виндов, но учитывал поведение 2000-х. Так вот в ветке для 2000-х она вычисляла длину строки (tchar *, вроде бы) с помощью sizeof(). Надо ли говорить что оно не работало как требуется, а я пребывал в замешательстве - в микрософт такие программисты :eek:

Так что, и правда, никогда не используй!

3
30 июля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Phodopus

Так что, и правда, никогда не используй!


А может, просто, разобраться, что такое strlen и что такое sizeof ?
Что это совершенно разные вещи и используются для совершенно разных целей.
Что одно является функцией, а другое - унарным оператором, превращающимся в константу ещё на этапе компиляции.

14
30 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: Green
А может, просто, разобраться, что такое strlen и что такое sizeof ?



Вот-вот! Ну будем надеяться что автор подтянет матчасть

15K
30 июля 2008 года
like-nix
46 / / 27.06.2007
Спасибо за наставления буду стараться.
Про то как работает sizeof и strlen я знаю, а вот внимательности не хватает.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог