0

我正在尝试使用 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
4

2 回答 2

2

您的代码有几个问题。

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

您不检查fopen()调用是否成功。

i用来计算你读到的字符,但你从来没有用它的价值做任何事情。

getc()函数返回 type 的结果int,因此您绝对应该创建tempChar一个int. 这样做的原因是它可以返回有效的字符值(将适合对象charEOF通常为-1. 通过将结果存储getc()char对象中,您将永远看不到EOF(如果 plainchar是无符号的),或者您将无法区分EOF有效的输入字符。

在对 Razvan 的回答发表评论时,您说您将测试更改为tempChar != EOF. 除了我上面解释的问题外,循环的第一次迭代tempChar还没有初始化,比较的结果是不可预测的。

编写输入循环的常规方法getc()是:

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

就风格而言,write不是一个很好的名字FILE*。一方面,有一个同名的函数(由 POSIX 定义,而不是由 C 定义,但它仍然可能令人困惑)。您可能会调用FILE*对象inout不是。

于 2012-07-07T22:31:38.967 回答
0

您调用 getc 两次:一次在 for 条件中,一次在 for 正文中。删除这一行: tempChar = getc(f); 然后再试一次。

于 2012-07-07T22:19:59.293 回答