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

标签 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

最佳答案

您的代码有几个问题。

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

关于c - 在C中使用getc()函数的未知逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11379088/

相关文章:

c - getc 和 fscanf 的区别

c - 用 "argv[2]"替换一个字符

c - 如何在 32 位架构中为 64 位整数创建数据结构?

c++ - 数组下标的无效类型 ‘unsigned char[int]’

c - 在 apache2 中重新编译 mod\模块

perl - 如何诊断 Perl 的 getc 问题?

c - 这条 "max"行是什么意思?

c# - 有没有办法检查TextWriter是否关闭?

php - 如何在codeigniter中编写一个新文件?

c - 从不断更新的文件中读取