2016-12-26 4 views
1

Я читаю из файла в строку с функцией fread и затем печатаю строку. Я определил строку как массив символов с размером LONGNUM (предварительно определенное значение). Я читаю 1 элемент размером 1 байт каждый раз. при печати строки с помощью: printf («строка, которая читается:% s \ n», буфер); вывод: строка, которая читается, является b . Я не понимаю, почему в конце строки получают эти значения? при печати строки с помощью: printf («строка, которая читается:% c \ n», buffer [0]); Я получаю вывод записи без значений. , пожалуйста, объясните мне почему.Печать строки с% s печатает неверные данные

код

#include <stdio.h> 
#define LONGNUM 1 

void main(int argc,char *argv[]) 
{ 

    FILE * src; 
    FILE * dst; 
    int num; 
    char buffer[LONGNUM]; 

    // argc is the number of the elements in argv 
    // the first argv element is the name of the program 

    if(argc < 3){ 
     printf("prototype error <source path> <dest path>\n"); 
     return; 
    } 
    printf ("source path is : %s \n",argv[1]); 
    printf ("dest path is : %s \n",argv[2]); 

    src = fopen(argv[1],"r"); 

    while(!(feof(src))){ 
     num = fread(buffer,1,1,src); 
     printf("the number of items read %d\n",num); 
     printf("the string that read is %s\n",buffer); 
     //printf("the string that read is %c\n",buffer[0]); 

    } 

} 

Я хотел бы, чтобы вы мне посоветовать, что это способ записи, чтобы сделать это. Спасибо.

+3

'% s' требует не менее двух байтов - поэтому' LONGNUM' должно быть не менее 2, и вам нужно будет указать '% 1s', чтобы прочитать один символ в строке. Вы можете использовать '% c' для чтения одного символа, но ваша строка не будет завершена нулем. Более разумно, установите 'LONGNUM' на 128 или 4096 или что-то еще большое. –

+2

while (! (Feof (src)) неправильно, потому что он проверяет что-то, что не имеет значения, и не может проверить что-то, что вам нужно знать. В результате вы ошибочно выполняете код, который предполагает, что он обращается к данным, которые были читайте успешно, когда на самом деле этого никогда не было. –

+0

@SumitGemini: стандартный вопрос x-ref ['while (! feof (file))' всегда ошибочен] (http://stackoverflow.com/questions/5431941/while -feof-file-is-always-wrong). –

ответ

1

% спецификатор спецификаций ожидает нулевая строка. fread не завершает строку с нулевым значением, поэтому вы не видите корректного вывода. поскольку буфер имеет длину 1,% c - правильный спецификатор для печати.

+1

@ Стартер: Кажется, вы указали неверную ссылку. – alk

+2

Неправильно вы можете сделать 'printf ("%. 1s ", buffer)', [reference] (http://stackoverflow.com/a/3767300/7076153). @alk исправлено, спасибо. – Stargateur

Смежные вопросы