Неизвестная логическая ошибка с использованием функции getc() в C
Я пытаюсь использовать функцию getc() для копирования содержимого одного файла в другой. Но я делаю неизвестную логическую ошибку, потому что вывод следующей программы - куча мусора.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *f;
FILE *write;
f = fopen("nums.csv","r");
write = fopen("numsWrite.dat","w");
char tempChar;
int i;
for(i = 0; (tempChar = getc(f)) != EOF; i++)
{
tempChar = getc(f);
fprintf(write,"%c",tempChar);
}
fprintf(write,"\n");
fclose(f);
fclose(write);
return 0;
}
Содержание nums.csv:
1256,2548,35151,15,56,38
программа возвращает:
2624,55,55,8
2 ответа
Есть несколько проблем с вашим кодом.
int main()
должно быть int main(void)
; это незначительная проблема, которая почти наверняка ничего не повредит, но последняя более правильная.
Вы не проверяете, fopen()
звонки успешны.
Вы используете i
считать символы, которые вы читаете, но вы ничего не делаете с его значением.
getc()
функция возвращает результат типа int
так что обязательно надо сделать tempChar
int
, Причина этого заключается в том, что он может возвращать либо действительное значение символа (которое будет соответствовать char
объект) или значение EOF
который обычно -1
, Сохраняя результат getc()
в char
объект, либо вы никогда не увидите EOF
(если обычный char
без знака), или вы не сможете отличить EOF
от допустимого входного символа.
В комментарии к ответу Развана вы сказали, что изменили тест на tempChar != EOF
, Помимо проблемы, которую я объяснил выше, на первой итерации цикла tempChar
не был инициализирован, и результат сравнения непредсказуем.
Традиционный способ написать цикл ввода, используя getc()
является:
int c;
while ((c = getc(f)) != EOF) {
/* do something with c */
}
Как вопрос стиля, write
не очень хорошее имя для FILE*
, Во-первых, есть функция с таким именем (определенная POSIX, а не C, но она все еще может сбивать с толку). Вы можете позвонить FILE*
объекты in
а также out
вместо.
Вы вызываете getc два раза: один раз в условии for и один раз в теле for. Удалить эту строку: tempChar = getc(f); и попробуй еще раз.