вызов read в linux добавляет новую строку в EOF? - PullRequest
0 голосов
/ 10 июня 2018

почему read () для файла в linux добавляет символ новой строки в EOF, даже если файл действительно не имеет символа новой строки?

мои данные файла:

1hello2hello3hello4hello5hello6hello7hello8hello9hello10hello11hello12hello13hello14hello15hello

мой вызов read () для этого файла должен нажать EOF после прочтения последнего «o» в «15hello».Я использую следующее:

while( (n = read(fd2, src, read_size-1)) != 0) // read_size = 21
{
    //... some code
    printf("%s",src);
    //... some code
}

, где fd2 - дескриптор файла.В последнем цикле n было 17, и у меня было src [16] = '\ n'.Итак ...... добавляет ли вызов чтения в linux новую строку в EOF?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

почему read () для файла в linux добавляет символ новой строки в EOF, даже если файл действительно не имеет символа новой строки? Нет , read() системный вызовне добавляет новую строку в конец файла.

Вы испытываете подобное поведение, потому что, возможно, вы создали текстовый файл с помощью команды vi и обратите внимание, что новая строка по умолчанию добавляется, если вы создали файл с использованием vi.

Вы можете проверить это в своей системе, создав пустой текстовый файл, используя vi, а затем запустив команду wc.

Также вы можете прочитать данные файла, используя систему read()Вызовите все сразу, если вы знаете размер файла (найдите размер с помощью системного вызова stat()) и можете избежать цикла while.

This

while( (n = read(fd2, src, read_size-1)) != 0) { 
   /* some code */
}

Изменить на

struct stat var;
stat(filename, &var); /* check the retuen value of stat()..having all file info now */
off_t size = var.st_size;

Теперь у вас есть size файла, создайте один динамический массив или массив стека, равный size, и прочитайте данные из файла.

char *ptr = malloc(size + 1);

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

read(fd,ptr,size);/*now ptr having all file contents */

И наконец, когда работа сделана, Не забудьте освободить ptr, позвонив по номеру free(ptr).

0 голосов
/ 10 июня 2018

добавляет ли вызов чтения в linux новую строку в EOF?

Нет.

Ваш входной файл, скорее всего, содержит завершающий символ новой строки - наиболее хорошо отформатированныйтекстовые файлы, поэтому несколько файлов могут быть объединены без строк, работающих вместе.

Вы также можете столкнуться с символом новой строки, который уже был в вашем буфере, поскольку read() не завершает чтение данных с помощьюNUL символ для создания фактической строки в стиле C.И я думаю, что ваш код тоже нет, иначе вы бы опубликовали его.Это означает, что ваше

printf("%s",src);

вполне вероятно неопределенное поведение.

...