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 code> 是无符号的),否则您将无法区分 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 - 解释c程序的输出

c - 带逻辑运算符的有符号和无符号整数

c# - 如何将行写入线程安全的文本文件 - 多线程

c - 在txt文件中搜索关键字并用C记录它

raku - perl6 从 $*IN 输入多个多行此处文档的最佳方式是什么

c - 使用 getc 和 putc 打印文件内容

c - 如何仅使用堆栈操作对堆栈进行排序?

C 替换密码

c - 如何同时输出到控制台和文本文件以使它们相同

c++ - Windows XP 在启动时用 C++ 读取文本文件的速度较慢;预取?