使用C中的getc()函数的未知逻辑错误

时间:2012-07-07 22:17:40

标签: c file-io getc

我正在尝试使用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 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。

int main()应为int main(void);这是一个小问题,几乎肯定不会伤害任何东西,但后者更正确。

您不会检查fopen()来电是否成功。

您正在使用i来计算您阅读的字符,但您从未对其值进行任何操作。

getc()函数返回int类型的结果,因此您肯定使tempChar成为int。这样做的原因是它可以返回有效的字符值(适合char个对象)EOF,通常为-1 。通过将getc()的结果存储在char对象中,您永远不会看到EOF(如果普通char未签名),或者您将无法将EOF与有效的输入字符区分开来。

在评论Razvan的回答时,你说你把测试改为tempChar != EOF。除了我上面解释的问题之外,在循环的第一次迭代tempChar尚未初始化,并且比较的结果是不可预测的。

使用getc()编写输入循环的传统方法是:

int c;
while ((c = getc(f)) != EOF) {
    /* do something with c */
}

作为一种风格问题,write不是FILE*的好名字。首先,有一个该名称的功能(由POSIX定义,而不是由C定义,但它仍然可能令人困惑)。您可以改为调用FILE*对象inout

答案 1 :(得分:0)

你可以两次调用getc:一次处于for状态,一次处于for body状态。删除这一行:tempChar = getc(f);然后再试一次。