为什么我的printf()不打印文本文件中的第一个字符?

时间:2018-12-12 14:44:53

标签: c file error-handling file-handling

我是菜鸟C程序员。 我无法读取文本文件中的所有字符。 我的file.txt具有数字:9,2,3,4,5,6,但是当我运行下面编写的代码时,它只是跳过9并显示其余数字。但是,当我在9之前放置一个空格时,它可以完美运行。我如何解决它?以及为什么会发生?

FILE* fp;
fp = fopen("file.txt", "r");
int a[10];
char ch;

while((ch=getc(fp))!= EOF)
{
    fscanf(fp, "%d", &a[ch]);
    printf("%d ", a[ch]);
}

预先感谢;

2 个答案:

答案 0 :(得分:2)

getc中的功能while((ch=getc(fp))!= EOF)使用文件中的单个字符;如果9是文件中的第一个字符,则将其简单地读取到ch中,并且-因为您的字符集可能是ASCII码,所以-将设置ch==0x39

因此(1)9将不再可用fscanf(fp, "%d", &a[ch]);;这就是为什么您认为它“已跳过”的原因。

(2)在位置a上对ch进行写操作,然后超出了a的数组范围。

答案 1 :(得分:1)

目前尚不清楚文件中有多少int,并且当前存储它们的方式容易出错。 fgetc返回int(-1)或0-255的EOF,因此ch应该被声明为int,然后再声明为{{1 }}是正确的,(ch=getc(fp))!= EOF将包含0-255。 在下面的ch中,您将再次从文件中读取文件,但将其移至索引位置fscanf(fp, "%d", &a[ch]);处的数组中,这显然不是您的意图(当您读取带有值的字符时,它也可能会崩溃> 9.提示:“ 0”的值为48)。下面的解决方案可能看起来过于复杂,但是我已经习惯了C ++,这些事情发生在幕后,而您不必为此烦恼。也许您可以通过摘除它们来得到一些想法。

ch