求C语言高手,一个文本文件,我想把它存到一个结构体数组中,每一行的数字为一个数组,我是这样写的

#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
struct part{
int a[10];
int n;
};
int main()
{
int ch,i=0,j=1;
struct part shuju[10];
FILE *fp,*fl;
if((fp=fopen("xy","r"))==NULL)
printf("error");
fl=fp;
ch=fgetc(fl);
while(!feof(fp)){
if(ch=='\n'){
i=0;
j++;
printf("\n");
}
else{
fscanf(fp,"%d",&shuju[j].a[i]);
printf("%d",shuju[j].a[i]);
i++;
ch=fgetc(fl);
}
}
fclose(fp);
return 0;
}
请问哪错了,或者给我个正确的,求指教。

#include<stdio.h>
#include<stdlib.h>
struct part
{
int a[10];
int n;
};
int main()
{
int ch,i=0,j=1;
long length=1;
struct part shuju[10];
FILE *fp;
if((fp=fopen("xy.txt","r"))==NULL)
printf("error");
ch=fgetc(fp);
fseek(fp,0L,SEEK_SET);
while(!feof(fp))
{
if(ch=='\n')
{
i=0;
j++;
ch=fgetc(fp);
printf("\n");
length=ftell(fp);
fseek(fp,length-1,SEEK_SET);
}
else
{
fscanf(fp,"%d",&shuju[j].a[i]);
printf("%d\t",shuju[j].a[i]);
i++;
ch=fgetc(fp);
}
}
printf("\n");
fclose(fp);
return 0;
}

楼主的定义两个文件指针的目的是不想让文件内部指针乱动,影响读取数据吧,但是这是不行的,因为即使定义了两个指针,读取ch时,文件内部指针还是会动。惟一的办法就是用ftell函数读取文件指针位置,然后再用fseek函数把文件内部指针位置移动到所需要的地方。。。

追问

fscanf(fp,"%d",&shuju[j].a[i]);
printf("%d\t",shuju[j].a[i]);
i++;
ch=fgetc(fp);
就是这一段代码不会让fp移动两次么?fscanf(fp,"%d",&shuju[j].a[i]);应该再读就是下个数了,而ch=fgetc(fp)也会让fp指向下个字符。。还请大神解惑

追答

读取文件时,读取的同时,文件内部的指针向后移动。fscanf函数读取数字,同时指针后移。fgetc也会让指针后移,这个函数主要是判断是否换行。假如正好到换行了,ch是换行符,进去入if语句,里面还得用到fgetc,这时候读取的是下一行第一个数字的最高位,此时必须让文件内部指针后退一个单位。假如没有fseek函数移动指针,每一行的第一个数字的最高位被赋值给ch,而结构体只能读取第一个数字最高位后面的位了。

追问

如果这样的话如果我在每次都为换行符的时候对这个数组进行操作,排序什么的,那文件里面的最后一排数字不是就不能操作了吗?问题有点多,我会加分的,还有就是发现把
length=ftell(fp);
fseek(fp,length-1,SEEK_SET)
删除了也一样的可以运行,结果也是正确的

追答

删除之后 不能读取吧,如下:

第二行和第三行第一个数的最高位没有读取。。。

如果对数组操作,只能对已经读取的数据进行操作,未读取的数据肯定是不能操作的。可以把所有的数据都读取后,在进行操作啊。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-19
fgetc是用来读字符的吧,你结构体里定义了一个整型变量,读个字符放进去肯定有问题···
你这个我看着看着就看不懂了,想读数据这种直接用fread就好了;
像这样
fread(part 型指针,sizeof(part),1,fp);
你可以先定义一个part型的数组
struct part a【100】 = {0};
while(1)
{
if(fread(a,sizeof(part),1,fp) == 1)
{
a++;
}
else {
break;
}
}
这样应该就可以了···追问

但是每个行的数字是不同的呀,我是想遇到了'\n'就开始下一个数组。。。

相似回答