在eof之后从文件输入到C中的数组
我试图将一个文件中的所有信息放入一个数组中,在我已经遍历该文件以查看该文件有多少行之后。如果我在文件中放置一行,它似乎可以工作,但是,如果我在返回文件时将数组位置设置为文件行,然后打印数组,则得出的数字与应该的数字不同 这是我的密码在eof之后从文件输入到C中的数组,c,C,我试图将一个文件中的所有信息放入一个数组中,在我已经遍历该文件以查看该文件有多少行之后。如果我在文件中放置一行,它似乎可以工作,但是,如果我在返回文件时将数组位置设置为文件行,然后打印数组,则得出的数字与应该的数字不同 这是我的密码 int main() { //Opens File char fName[20]; // fName = getchar(); scanf( "%s", fName);
int main()
{
//Opens File
char fName[20];
// fName = getchar();
scanf( "%s", fName);
FILE *fpIn;
fpIn = fopen ( fName, "rt");
// fpIn = fopen( "test1.txt", "rt");
if ( fpIn == NULL)
{
printf( "Unable to open: ");
exit(99);
}
//Gets Lines
int lines=0;
char ch;
while((ch=fgetc(fpIn))!=EOF)
{
if (ch=='\n') { lines++; }
}
clearerr(fName *fpIn);
fclose(fpIn);
fopen(fName, "rt");
//Makes Array
int *pA;
pA = (int *)malloc(lines*sizeof(int));
//Fills Array
for (int i=0; i<lines; i++)
{
while ((ch=fgetc(fpIn))!='\n')
{
pA[i] = ch;
}
ch=fgetc(fpIn);
}
for (int i=0; i<lines; i++)
{
printf("%d\n", pA[i]);
}
return 0;
}
intmain()
{
//打开文件
char-fName[20];
//fName=getchar();
scanf(“%s”,fName);
文件*fpIn;
fpIn=fopen(fName,“rt”);
//fpIn=fopen(“test1.txt”、“rt”);
如果(fpIn==NULL)
{
printf(“无法打开:”);
出口(99);
}
//获取线路
int行=0;
char ch;
而((ch=fgetc(fpIn))!=EOF)
{
如果(ch='\n'){lines++;}
}
clearerr(fName*fpIn);
fclose(fpIn);
fopen(fName,“rt”);
//制作数组
int*pA;
pA=(int*)malloc(lines*sizeof(int));
//填充数组
对于(int i=0;i考虑代码的这一部分:
while ((ch=fgetc(fpIn))!='\n')
{
pA[i] = ch;
}
i
在这个循环过程中不会改变,因此pA[i]
会被每个新字符覆盖。您将得到pA[i]
包含行中最后一个字符。同时切换到fscanf()语句而不是getc()正如沃恩·卡托(Vaughn Cato)所建议的那样,这无疑有助于我找到正确的解决方案。真正不同的是删除了while语句,该语句进行了检查,以确保我在进入下一个整数之前已经到达了行的末尾
代码现在是这样的:
for (int i=0; i<lines; i++)
{
fscanf(fpIn, "%lf", &pA[i]);
}
for(inti=0;iSo)那么我需要一个二维数组吗?我想我不知道为什么这样做有意义,因为它们都是数字。我把它修改成这样;while((ch=fgetc(fpIn))!='\n'{pA[i]=putchar(ch);}ch=fgetc(fpIn);现在它将正确的值写入屏幕,数组中仍然填充着与行的最后两个位置不匹配的字符。@aprohl5:您可能会混淆数字和字符。您的输入文件是什么样子的?最初它是一个浮点数列表。但我认为ught同样的事情,所以我把文件变成了数字1-9的列表,我遇到了同样的问题。@aprohl5:即使是单个数字,也有区别。字符“1”在ascii中的值是49,所以当你试图将其作为一个字符来读时,你会得到这个值。如果你想读一个数字,你需要像scanf这样的东西。好的,我把它切换到scanf,它现在读为(inti=0;I