Неизвестная логическая ошибка с использованием функции 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); и попробуй еще раз.

Другие вопросы по тегам