2010-08-21 3 views
0

У меня есть следующие функции:fgets читает слишком много символов, чем существует

void writeResults(FILE* fp, FILE* fpw, Vector w, int size) { 

Vector x; 

while (1) { 

     char line[MAX_DIMENSION]; //max dimension is 200 

     if((fgets(line,MAX_DIMENSION,fp)) == NULL) { //EOF 
      return; 
     } 
     else { 
      int i=0; 
      while (line[i]!='\0') { 
       printf("% d %c\n",i,line[i]); //print to check it 
       i++; 
      } 
     } 
} 
} 

Строка файла он читает это:

1,1 
2,2 

Однако при печати каждого символа до «\ 0» Я получаю этот выход:

0 1 
1 , 
2 1 
3 
4 
0 2 
1 , 
2 2 
3 
4 

кто-нибудь есть ключ к пониманию того, почему он читает дополнительные 3 и 4 символов? (в файле нет лишних пробелов).

Примечание: файл был открыт следующим образом:

FILE* fp = fopen(fileIn, "r"); 
if (fp == NULL) { 
    perror("Couldn't open File"); 
    exit(errno); 
} 
+0

Не забудьте выбрать ответ, который вам больше всего помог - выделите белый галочку (галочку) на LHS. И делайте это по всем вопросам, где у вас есть полезный ответ. Это часть того, чтобы быть хорошим гражданином на SO. –

ответ

1

возврат каретки, перевод строки - на Windows?

Это помогло бы, если бы мы знали, как вы открыли файл. Если вы открыли его как текстовый файл, вы не должны видеть два дополнительных символа - только один для новой строки. Однако, если вы открываете его как двоичный файл, он должен действительно читать как CR, так и LF.

Если вы находитесь в Linux, как указано в комментариях, то у нас есть больше доступных диагностических инструментов. Возможно, самым простым для начала является «od -c file»; это покажет вам, что именно находится в файле. Обратите внимание: если файл был когда-либо в окне Windows, он все равно мог бы иметь окончания строки CRLF. Если вы используете «vim», он может сказать вам, что тип файла «[dos]».

В качестве альтернативы, вы можете печатать символы как целые числа (а также символов):

printf("%d (%2d) %c\n", i, line[i], line[i]); 

Вы должны увидеть 49 для '1', 50 для '2', 44 для '', 10 для newline (LF, '\n'), и что-то еще - такова тайна (но она показала бы 13 для CR).


CR - это символ \r в источнике C. Он использовался для указания того, что печатающая головка должна вернуться к началу строки (каретка принтера вернулась к началу строки); LF или линейный канал прокручивали бумагу вверх по линии. Windows и MS-DOS используют последовательность CRLF (curr-liff) для указания конца строки; Unix всегда использовал только LF, aka newline или NL; MacOS 9 и ранее использовали только CR.

+0

Я действительно не знаю, что такое возврат каретки ... я работаю на linux –

+0

OK - на Linux это гораздо реже будет проблемой. Я добавлю некоторые предложения в свой ответ. –

+0

обновил вопрос с openinig stream ... однако вы все в порядке .. спасибо за ответы –

2

не печатать% c, печатать% d, и вы увидите символы ascii-кода. вы увидите символы возврата каретки и строки.13 и 10

см http://www.asciitable.com/

1

Я думаю, что ваш входной файл contains-

1,1 
[SPACESPACE] 
2,2 
[SPACESPACE] 

так первый раз fgets читал как-

line{'1',',','1','',''} 

и второй раз читает

line{'2',',','2','',''} 

Вот почему вы получаете выход, как вы указали.