user-0 提问: 文件的读取数据出错

回复:
user: user-0
content: 引用 15 楼 赵4老师的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 嗯嗯，是这样的！！！！

user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-0
content: 引用 10 楼 weixin_44603568的回复:我说两句哈!        第一  feof() 这函数你得先读取才能判断.当你读文件时读到了结束标志位.这函数才能给你返回非0值                 意思是啥呢?                 先判断,读文件,输出....判断上一个内容,读取并输出下一个内容,当你读出结束标志位了,你的判断是上一个内容                 你就把结束标志位也输出出去了.输出完了才判断到结束标志位.结束循环.                 问题也不是很大,只不过多输出了一个无用数据        第二  用哪种方式去读文件,你要去看文件格式,你觉得你看到的文件是 1 2 3 4 5就认为他是 1 2 3 4 5                 其实在程序看来 他是  0011 0001 0011 0010 0011 0011 0011 0100 0011 0101 == "12345"                 拿你的程序举例子:比如说 文件中写着一行        "张三 1 99" , 你猜这是几个字节?                 汉子2个字节,其他1个字节,两个空格,3个数字......一共9个字节                 定义结构体为  char name[10]  ; int num  ; int score ;  你觉得合适吗?                 int看做4个字节, 一个结构体就是18个字节,你试着把这9个字节挨着从头到尾的码到你的结构体中试试?                 全码到name[10]里面了是不是?那num 和 score 是多少你能确定么?要么随机值,要么0....                 格式化输出一下试试? printf("%s %d %d\n",name , num , score); 你觉得这样对不对?                 先输出%s,name 里面放着什么? "张三 1 99"就是输出了对不对? 那剩下的呢? 要么0,要么随机值是不是?                 就成了       "张三 -18256788769556 -6897653287" 或者 "张三 0 0"后面这种情况算好的了                 知道为什么了吗? 你知道要怎么改了吗?                 给你一个思路,简单点的就是 fscanf(结构体名,"%s %d %d\n" , fp); 一行中有几个变量就有几个对应的格式转换符                 你要嫌弃太麻烦不智能,那就一个一个扫秒,配合if判断,自己写格式转换.明白了吧? 最后发现是在输出printf是发现用的是%d，但是定义的是float，用错了，然后成了那样一串数字

user: user-0
content: 引用 10 楼 weixin_44603568的回复:我说两句哈!        第一  feof() 这函数你得先读取才能判断.当你读文件时读到了结束标志位.这函数才能给你返回非0值                 意思是啥呢?                 先判断,读文件,输出....判断上一个内容,读取并输出下一个内容,当你读出结束标志位了,你的判断是上一个内容                 你就把结束标志位也输出出去了.输出完了才判断到结束标志位.结束循环.                 问题也不是很大,只不过多输出了一个无用数据        第二  用哪种方式去读文件,你要去看文件格式,你觉得你看到的文件是 1 2 3 4 5就认为他是 1 2 3 4 5                 其实在程序看来 他是  0011 0001 0011 0010 0011 0011 0011 0100 0011 0101 == "12345"                 拿你的程序举例子:比如说 文件中写着一行        "张三 1 99" , 你猜这是几个字节?                 汉子2个字节,其他1个字节,两个空格,3个数字......一共9个字节                 定义结构体为  char name[10]  ; int num  ; int score ;  你觉得合适吗?                 int看做4个字节, 一个结构体就是18个字节,你试着把这9个字节挨着从头到尾的码到你的结构体中试试?                 全码到name[10]里面了是不是?那num 和 score 是多少你能确定么?要么随机值,要么0....                 格式化输出一下试试? printf("%s %d %d\n",name , num , score); 你觉得这样对不对?                 先输出%s,name 里面放着什么? "张三 1 99"就是输出了对不对? 那剩下的呢? 要么0,要么随机值是不是?                 就成了       "张三 -18256788769556 -6897653287" 或者 "张三 0 0"后面这种情况算好的了                 知道为什么了吗? 你知道要怎么改了吗?                 给你一个思路,简单点的就是 fscanf(结构体名,"%s %d %d\n" , fp); 一行中有几个变量就有几个对应的格式转换符                 你要嫌弃太麻烦不智能,那就一个一个扫秒,配合if判断,自己写格式转换.明白了吧? 好的好的，明白了，谢谢大神

user: user-0
content: 引用 11 楼 northwesternwind的回复:[quote=引用 4 楼 ONE~ 的回复:] [quote=引用 2 楼 自信男孩的回复:]文件里的数据是你通过fwrite写入的吗？如果不是，那么使用fread是有可能读取的不正确。 是通过fwrite写入的，然后通过fread读取[/quote] 看了下错误的数据，是"@&"。感觉是你的fwrite写的不对吧? 把fwrite代码贴出来。 [/quote] 已经发现了错误，是输出类型错误，没有及时改正过来

user: user-0
content: 引用 6 楼 赵4老师的回复:仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8   好的好的，谢谢谢谢！！！

user: user-0
content: 引用 6 楼 赵4老师的回复:仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8   好的好的，谢谢谢谢！！！

user: user-0
content: 引用 6 楼 赵4老师的回复:仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8   好的好的，谢谢谢谢！！！

user: user-1
content: 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-0
content: 换了之后还是数据读取不行

user: user-0
content: 引用 2 楼 自信男孩的回复:文件里的数据是你通过fwrite写入的吗？如果不是，那么使用fread是有可能读取的不正确。 是通过fwrite写入的，然后通过fread读取

user: user-0
content: 引用 1 楼 northwesternwind的回复:问本文件里面的数据不能用fread这样子读取，只能用fscanf一个一个扫描。 感谢感谢，我一会儿去试一试

user: user-2
content: 引用 4 楼 ONE~ 的回复:[quote=引用 2 楼 自信男孩的回复:]文件里的数据是你通过fwrite写入的吗？如果不是，那么使用fread是有可能读取的不正确。 是通过fwrite写入的，然后通过fread读取[/quote] 看了下错误的数据，是"@&"。感觉是你的fwrite写的不对吧? 把fwrite代码贴出来。

user: user-3
content: 我说两句哈!        第一  feof() 这函数你得先读取才能判断.当你读文件时读到了结束标志位.这函数才能给你返回非0值                 意思是啥呢?                 先判断,读文件,输出....判断上一个内容,读取并输出下一个内容,当你读出结束标志位了,你的判断是上一个内容                 你就把结束标志位也输出出去了.输出完了才判断到结束标志位.结束循环.                 问题也不是很大,只不过多输出了一个无用数据        第二  用哪种方式去读文件,你要去看文件格式,你觉得你看到的文件是 1 2 3 4 5就认为他是 1 2 3 4 5                 其实在程序看来 他是  0011 0001 0011 0010 0011 0011 0011 0100 0011 0101 == "12345"                 拿你的程序举例子:比如说 文件中写着一行        "张三 1 99" , 你猜这是几个字节?                 汉子2个字节,其他1个字节,两个空格,3个数字......一共9个字节                 定义结构体为  char name[10]  ; int num  ; int score ;  你觉得合适吗?                 int看做4个字节, 一个结构体就是18个字节,你试着把这9个字节挨着从头到尾的码到你的结构体中试试?                 全码到name[10]里面了是不是?那num 和 score 是多少你能确定么?要么随机值,要么0....                 格式化输出一下试试? printf("%s %d %d\n",name , num , score); 你觉得这样对不对?                 先输出%s,name 里面放着什么? "张三 1 99"就是输出了对不对? 那剩下的呢? 要么0,要么随机值是不是?                 就成了       "张三 -18256788769556 -6897653287" 或者 "张三 0 0"后面这种情况算好的了                 知道为什么了吗? 你知道要怎么改了吗?                 给你一个思路,简单点的就是 fscanf(结构体名,"%s %d %d\n" , fp); 一行中有几个变量就有几个对应的格式转换符                 你要嫌弃太麻烦不智能,那就一个一个扫秒,配合if判断,自己写格式转换.明白了吧?

user: user-4
content: 文件里的数据是你通过fwrite写入的吗？如果不是，那么使用fread是有可能读取的不正确。

user: user-2
content: 问本文件里面的数据不能用fread这样子读取，只能用fscanf一个一个扫描。