#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;
}
请问哪错了,或者给我个正确的,求指教。
楼主的定义两个文件指针的目的是不想让文件内部指针乱动,影响读取数据吧,但是这是不行的,因为即使定义了两个指针,读取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)
删除了也一样的可以运行,结果也是正确的
删除之后 不能读取吧,如下:
第二行和第三行第一个数的最高位没有读取。。。
如果对数组操作,只能对已经读取的数据进行操作,未读取的数据肯定是不能操作的。可以把所有的数据都读取后,在进行操作啊。。
但是每个行的数字是不同的呀,我是想遇到了'\n'就开始下一个数组。。。