我正在尝试使用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
答案 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*
对象in
和out
。
答案 1 :(得分:0)
你可以两次调用getc:一次处于for状态,一次处于for body状态。删除这一行:tempChar = getc(f);然后再试一次。