我正在尝试使用 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*
对象称为 in
和 out
。
关于c - 在 C 中使用 getc() 函数出现未知逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11379088/