2013-11-29 3 views
0

Так вот код, который я пытаюсь заставить работать:Неправильный выход fprintf в с

char* inFile = "input.txt"; 
FILE *out = fopen("output.txt", "a+"); 
int i = 0 
while(i < 5){ 
      int countFound = findWord(inFile, keyWord[i]);//returns count of keywords in given file 
      fprintf(out, "%s: %d\n", keyWord[i], countFound); 
      i++; 
     } 
fclose(out); 

Выход этого кода:

youshouldsee1 
: 3 
youshouldsee2 
: 3 
youshouldsee3 
: 3 
youshouldsee4 
: 3 
youshouldsee5: 1 

Ожидаемый результат:

youshouldsee1: 3 
youshouldsee2: 3 
youshouldsee3: 3 
youshouldsee4: 3 
youshouldsee5: 1 

Я действительно не понимаю, почему вывод такой, не должен ли он печатать строку и int, а затем новую строку? Также обратите внимание, что после последней строки нет новой строки, и должно быть. Я сделал некоторые испытания, и я заметил, что если бы я изменил fprintf заявление fprintf(out, "%s\n", keyWord[i]); выход:

youshouldsee1 
youshouldsee2 
youshouldsee3 
youshouldsee4 
youshouldsee5 

Какой отформатирован намного лучше. Снова обратите внимание, что после последней строки нет новой строки, и должно быть. Я заметил, что, делая это с помощью только printf операторов, я получаю точно такую ​​же проблему, но результат немного перепутался.

Кто-нибудь знает, что вызывает эту проблему? Очень признателен.

Массив keyWord [] - это двойной указатель, я не уверен, что это имеет значение или нет, но я подумал, что упомянул бы об этом. Это объявлено так char** keyWord;. И он был создан следующим образом:

char *tempWord = "something"; 
keyWords[x] = strdup(tempWord); 

Это может быть совершенно неуместным, но я подумал, что лучше всего упомянуть об этом.

+0

Ключевое слово string должно иметь символы новой строки в конце их. – Gene

+0

Пожалуйста, добавьте объявления всех переменных, поэтому нам не нужно гадать. – hyde

+0

@Gene, Когда я создаю строку или когда использую fprintf? – JumpingRock

ответ

0

У вас наверняка есть символы возврата каретки ('\r' или 0x0D) и/или символы обратного пробела ('\b' или 0x08) в ваших строках keyWord[i].

CRs и backspaces обычно не печатаются на терминалах и вместо этого перемещают курсор-CR-терминалы, перемещая курсор в начало текущей строки, а обратные области перемещают курсор назад на один символ. Когда печатаются последующие символы, они перезаписывают, что было раньше. Так что этот код

printf("foobar\rbaz\n"); 

результаты в этом выходе

bazbar 

и этот код

printf("foo\bbar\n"); 

результаты в этом выходе

fobar 

Если вы посмотрите на сырые байт выход без печати на терне minal, вы должны увидеть CRs и backspaces как день. Мне нравится использовать программу hexdump(1). Например:

$ echo -e 'foobar\rbaz' 
bazbar 
$ echo -e 'foobar\rbaz' | hexdump -C 
00000000 66 6f 6f 62 61 72 0d 62 61 7a 0a     |foobar.baz.| 
0000000b 

Так что я хотел бы предложить, глядя на необработанных данных в выходе вашей программы и выяснить, где противные символы, а затем выяснить, как избавиться от них.

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