标题:c 文件编程结果不对
只看楼主
小玲子zhl
Rank: 2
等 级:论坛游民
帖 子:15
专家分:30
注 册:2014-10-23
结帖率:50%
已结贴  问题点数:20 回复次数:8 
c 文件编程结果不对
#include<stdio.h>
struct student
{
    char name[20];
    int age;
    int num;
}stud[3];
void save()
{
FILE *fp;
int i;
if((fp=fopen("stu.c","wr"))==NULL)
{ printf("cannot open file\n");
return; }
for(i=0;i<3;i++)
if(fwrite(&stud[i],sizeof(struct student),1,fp)!=1)
{
    printf("file write error\n");
   fclose(fp);
}
if(i==3)fclose(fp);
}

void main()
{
    int i=0;
    for(i=0;i<3;i++)
    {scanf("%s%d%d",stud[i].name ,&stud[i].age ,&stud[i].num );}
    save();
}
编译是输入的   xiaomei 12 1
               xiaozhang 12 2
               xiaoqiang 13 3
在stu.c的文件中查看的时候是    xiaomei       xiaozhang       xiaoqiang  
没有输出岁数和学号!这是为什么啊,求高手指点!
搜索更多相关主题的帖子: include return cannot write 
2014-10-26 10:30
mmrx
Rank: 2
等 级:论坛游民
帖 子:42
专家分:71
注 册:2012-10-18
得分:5 
没编译啊,看了一下,感觉是这里出的问题
scanf("%s%d%d",stud[i].name ,&stud[i].age ,&stud[i].num )


输入的时候你在名字后面输入了空格,但是编译器需要的是一个%d int
你改成
scanf("%s %d %d",stud[i].name ,&stud[i].age ,&stud[i].num )

试试看。
2014-10-26 10:36
小玲子zhl
Rank: 2
等 级:论坛游民
帖 子:15
专家分:30
注 册:2014-10-23
得分:0 
2014-10-26 11:08
小玲子zhl
Rank: 2
等 级:论坛游民
帖 子:15
专家分:30
注 册:2014-10-23
得分:0 
这还是不对啊?为什么呢
2014-10-26 11:09
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
得分:15 
1.你只需要写文件,我认为就用w 格式打开就好
2.你使用文本文件格式打开文件,但你用fwrite 写文件,这样不严格,,这个函数用于二进制文件的读写,会出问题,
3.我不知道可不可以直接把一个结构体写进文件,还是要分开把结构体内的每一个量分别写问去,这点我不清楚。
4.对啦,为什么要建.c文件?这样可以吗?我总觉得怪怪的
我重写了,你参考
程序代码:
#include<stdio.h>
#include<stdlib.h>
struct student
{
    char name[20];
    int age;
    int num;
}stud[3];
void save()
{
     int i;

FILE *fp;

if((fp=fopen("stu.txt","w"))==NULL)
{ printf("cannot open file\n");
exit(1); }
for(i=0;i<3;i++)

 fprintf(fp,"%s %d %d\n",stud[i].name ,stud[i].age ,stud[i].num);   
if(i==3)fclose(fp);
else
{
   printf("file write error\n");
    fclose(fp); 
}
}

int main()
{
    int i=0;
    for(i=0;i<3;i++)
    scanf("%s %d %d",stud[i].name ,&stud[i].age ,&stud[i].num );
    save();
    system("pause");
    return 0;
}
2014-10-26 14:21
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
得分:0 
我刚试了一下把整个结构体给文件是对的!
还有,如果你想用fwrite可以这样写:
程序代码:
void save()
{
     int i;
for(i=0;i<3;i++)
  printf("%s %d %d \n",stud[i].name ,stud[i].age ,stud[i].num );
FILE *fp;

if((fp=fopen("stu.dat","wb"))==NULL)   //这里是.dat文件,但是你看不了,他是二进制打开的一个文件,你可以用别的程序打开它看。
{ printf("cannot open file\n");
exit(1); }
for(i=0;i<3;i++)
{fwrite(&stud[i],sizeof(struct student),1,fp);
printf("ok!");
}
if(i==3)fclose(fp);
else
{
   printf("file write error\n");
    fclose(fp); 
}
}
2014-10-26 14:49
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
得分:0 
回复 3 楼 小玲子 zhl
你这个可以理解为,

你只要记住,技术本都是以字符解码的,所以,当你用记事本打开这个你创建的文件时,它是8比特,8比特的读,这也是为什么你的名字会显示出来,但数字没有,因为数字是变长编码,所以你用8比特来读,一定会乱码,但这也说明,你的程序没大问题,只是你没弄清楚二进制文件和文本文件的区别。
2014-10-26 15:01
小玲子zhl
Rank: 2
等 级:论坛游民
帖 子:15
专家分:30
注 册:2014-10-23
得分:0 
回复 7 楼 soulmate1023
谢谢,谢谢,确实我对这块不是太懂,受教了,谢谢你。我回头再看看这方面的内容
2014-10-27 08:30
fogmaple
Rank: 4
来 自:江西省赣州市于都县
等 级:业余侠客
威 望:1
帖 子:119
专家分:233
注 册:2014-7-28
得分:0 
以下是引用soulmate1023在2014-10-26 15:01:55的发言:

你这个可以理解为,

你只要记住,技术本都是以字符解码的,所以,当你用记事本打开这个你创建的文件时,它是8比特,8比特的读,这也是为什么你的名字会显示出来,但数字没有,因为数字是变长编码,所以你用8比特来读,一定会乱码,但这也说明,你的程序没大问题,只是你没弄清楚二进制文件和文本文件的区别。

  

非常的赞同这个说法
2014-10-27 13:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-437708-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.975930 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved