首页 新闻 会员 周边 捐助

c语言文件操作问题

0
悬赏园豆:30 [已解决问题] 解决于 2012-04-13 20:31

怎么我的文件操作老是乱码,读取文本文件的内容,一点就乱七八糟的,大虾门说说,你们都怎么写这种程序。

就是那种一行分成8、9个分别赋给不同变量。

还有就是如果定义的数组只想让她接受其中一个信息,他不会把他后面的全都接受了吧?

问题补充:

fread()与fscanf();有什么区别?分别什么时候用

一只小小的菜鸟的主页 一只小小的菜鸟 | 初学一级 | 园豆:101
提问于:2012-04-11 20:50
< >
分享
最佳答案
1

输出的代码出错了!fread和fscanf区别看文档就好了。

1     /*原来的代码中输出了两个地址, 去掉&就对了,还有一个[i]改为[j]就对了*/
2     printf("%s %s %c %d %s %s %d %d %d %d %d\n",student[j].stuCount,student[j].name,student[i].grade,student[j].classNum,student[j].phoneNum,student[j].address,student[j].Marktotal,student[j].MarkCh,student[j].MarkMath,student[j].MarkEn,student[j].rankNum);
收获园豆:20
ChatinCode | 老鸟四级 |园豆:2272 | 2012-04-12 14:20

太感谢了,纠结了半天终于知道拿错了

看来我还是有点粗心~

一只小小的菜鸟 | 园豆:101 (初学一级) | 2012-04-13 13:04
其他回答(4)
0

把你的关键代码帖出来吧,大家可以帮你分析一下

收获园豆:5
artwl | 园豆:16736 (专家六级) | 2012-04-11 22:29

这段代码的年级和排名读取不出来,但别的都能读出来,不知道是什么原因?

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define STUDENT_NUM 1 //学生人数
#define COMMAND_LEN 6 //命令字符数

typedef struct studentMessage
{
char stuCount[11];//学号
char name[12];//姓名
char grade;//年级
int classNum;//班级
char phoneNum[12];//手机号码
char address[20];//住址

//成绩
int Marktotal;//总成绩
int MarkCh;//语文
int MarkMath;//数学
int MarkEn;//英语
int rankNum;//排名
}stuM;

int file(void)
{
stuM student[STUDENT_NUM];
int i,j;
FILE * fp = fopen("E:\\c_test.txt","r");//读文件中的字符
for(i = 0;i < STUDENT_NUM;i++)
{
fscanf(fp,"%s %s %c %d %s %s %d %d %d %d %d\n",student[i].stuCount,student[i].name,&student[i].grade,&student[i].classNum,student[i].phoneNum,student[i].address,&student[i].Marktotal,&student[i].MarkCh,&student[i].MarkMath,&student[i].MarkEn,&student[i].rankNum);//用定义的数组类型接收读取到的字符
if(feof(fp))// 代表着字符串的结束
break;
}

for(j = 0;j < STUDENT_NUM;j++)
{
printf("%3d ",j + 1);
printf("%s %s %c %d %s %s %d %d %d %d %d\n",student[j].stuCount,student[j].name,&student[i].grade,student[j].classNum,student[j].phoneNum,student[j].address,student[j].Marktotal,student[j].MarkCh,student[j].MarkMath,student[j].MarkEn,&student[j].rankNum);
}

getch();
return 0;
}
int main(void)
{
file();

getch();
return 0;
}

支持(0) 反对(0) 一只小小的菜鸟 | 园豆:101 (初学一级) | 2012-04-11 22:37
1

fread   :以字节位计算长度,按照指定的长度和次数读取数据,遇到结尾或完成指定长度读取后停止. 
fscanf   :格式化读取,按照指定的格式串进行读取数据,并将数据初始化为指定的格式.所以在文本方式下才能有效的判断数据内容.

其实文本和二进制的差别就在于读取的数据,文本方式会默认为是ASCII码,二进制方式则原样将数据读出.所以文本时候的格式控制如回车,制表符等,二进制的时候是不能有效的自动判断的。   

他们的效率要看具体的程序和算法的,否则差别并不会很大.其中fread   最快.因为可以指定读取长度.能够有效的减少I/O操作,硬盘读取才是文件操作最耗时的部分.

收获园豆:5
草根程序猿 | 园豆:129 (初学一级) | 2012-04-11 22:47
0

关注学习了。。。

KivenRo | 园豆:1734 (小虾三级) | 2012-04-12 09:48
0

关注学习了。。

Rollen Holt | 园豆:210 (菜鸟二级) | 2012-04-12 11:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册