c语言的文件操作

小小白杨123 2013-04-23 08:20:23
编写了一个简单的文件操作函数,将数据存入xuesheng文件,再将xuesheng文件中的数据读出来,最后读出来时候,每条数据后面都有一串数字,个人感觉是在scanf()函数中最后有个换行符有关,好像有一种方法是可以吃掉换行符的,实在查不到相关资料。现在来问问大家,或者还是其他原因导致的,现附代码和运行结果如下。
#include <stdio.h>
#include <stdlib.h>
//测试文件操作的函数
typedef struct std
{
int num;
char name[20];
int score;
}student;
int main()
{
student s[4];
int i;
printf("请输入4个学生的相学号,姓名,成绩:\n");
for(i=0;i<4;i++)
scanf("%d,%s,%d",&(s[i].num),s[i].name,&(s[i].score));
FILE *fp;
if((fp=fopen("xuesheng","wb"))==NULL)
{
printf("不能打开xuesheng文件!\n");
exit(0);
}
for(i=0;i<4;i++)
{
fwrite(&(s[i]),sizeof(student),1,fp);
}
fclose(fp);
FILE *readf;
if((readf=fopen("xuesheng","rb"))==NULL)
{
printf("读取文件时候,不能打开学生文件!\n");
exit(0);
}
printf("读出文件的内容如下所示:\n");
int j;
for(j=0;j<4;j++)
{
fread(&s[j],sizeof(student),1,readf);
printf("%d,%s,%d\n",s[j].num,s[j].name,s[j].score);
}

fclose(readf);
return 1;
}

...全文
151 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
UnknowName 2013-04-24
  • 打赏
  • 举报
回复
引用 6 楼 AnYidan 的回复:
scanf("%d %s %d",&(s[i].num),s[i].name,&(s[i].score)); 输入是记得用空格分隔
输入的时候为什么要用空格分隔呢? 有什么特别的需求吗? 如果这样的话,那么在控制台中,每输入一个数据,也都需要使用空格分隔的, 对吧?
UnknowName 2013-04-24
  • 打赏
  • 举报
回复
如果你想使用 fread(&s[j],sizeof(student),1,readf); 来读数据。 使用sprintf就不合适了。 这个时候,你需要做的是初始化之前的数组s。 具体的方法:

    student s[4];
    memset(s,0,sizeof(struct student) * 4);
把数据初始化完了以后,这样用于内存对齐的空间也被初始化为0了。 这样,你再读取的时候,就不会有乱码存在了。
UnknowName 2013-04-24
  • 打赏
  • 举报
回复
引用 10 楼 AnYidan 的回复:
引用 9 楼 tomur 的回复:引用 6 楼 AnYidan 的回复: scanf("%d %s %d",&amp;amp;(s[i].num),s[i].name,&amp;amp;(s[i].score)); 输入是记得用空格分隔 输入的时候为什么要用空格分隔呢? 有什么特别的需求吗? 如果这样的话,那么在控制台中,每输入一个数据,也……
姐姐,我英文不好,理解的不透彻。 能用中文指点一二吗?
UnknowName 2013-04-24
  • 打赏
  • 举报
回复

    for(i=0;i<4;i++)
    {
     fwrite(&(s[i]),sizeof(student),1,fp);
    }
这句话写入的是有问题的。

typedef struct std
{
    int num;
    char name[20];
    int score;
}student;
并不是你想象的那样,2个int,一个char数组, 由于有内存对齐的原因(具体的可以百度),所以struct std 除了你定义的那几个类型外,还有占用了一些空间用于内存对齐。 用sizeof(struct std)可以看到具体使用的字节数。 正确的写法应该是:

    for(i=0;i<4;i++)
    {
     char buf[128] = {0};
     sprintf(buf, "%d,%s,%d", s[i].num, s[i].name, s[i].score);
     fwrite(buf,sizeof(char),strlen(buf),fp);
    }
[/code]
AnYidan 2013-04-24
  • 打赏
  • 举报
回复
引用 9 楼 tomur 的回复:
引用 6 楼 AnYidan 的回复: scanf("%d %s %d",&amp;(s[i].num),s[i].name,&amp;(s[i].score)); 输入是记得用空格分隔 输入的时候为什么要用空格分隔呢? 有什么特别的需求吗? 如果这样的话,那么在控制台中,每输入一个数据,也都需要使用空格分隔的, 对吧?
An input field is defined as a string of non-white space characters; it extends either to the next white space character or until the field width, if specified, is exhausted.
AnYidan 2013-04-23
  • 打赏
  • 举报
回复
scanf("%d %s %d",&(s[i].num),s[i].name,&(s[i].score)); 输入是记得用空格分隔
_树 2013-04-23
  • 打赏
  • 举报
回复
zhangsan,100 整个被当做字符串存入了char name[20]中,int score得到的是乱码(一串数字)。
Carl_CCC 2013-04-23
  • 打赏
  • 举报
回复
scanf没问题的。
Carl_CCC 2013-04-23
  • 打赏
  • 举报
回复
引用 2 楼 littlebeat123 的回复:
引用 1 楼 derekrose 的回复:你说的是fflush?? 不太懂,我是想问为什么每组数据后面有一串数字(图片中圈起来的地方),如何去掉他们。
是你的输入出了问题,你不要用逗号了,用空格吧。因为lisi,90作为一个整体了。而你第三个参数压根没输入。
小小白杨123 2013-04-23
  • 打赏
  • 举报
回复
引用 1 楼 derekrose 的回复:
你说的是fflush??

不太懂,我是想问为什么每组数据后面有一串数字(图片中圈起来的地方),如何去掉他们。
derekrose 2013-04-23
  • 打赏
  • 举报
回复
你说的是fflush??

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧