c语言输入文件后读取少了一个字节,c语言 用fwrite输出数据后,想要用fread读取就不能! 第二个代码哪里出错了?知道...

满意答案

00e27ab806e4881f8254fe7ae8741834.png

u06wq803

2017.01.01

00e27ab806e4881f8254fe7ae8741834.png

采纳率:59%    等级:9

已帮助:420人

读文件程序

void main()

{

load(); 少了这句

for(i = 0; i < SIZE; i++)

{

printf("%s%d%d%s", stu[i].name, stu[i].num, stu[i].age, stu[i].addr );

}

}

如果作为了解C语言编程原理,你完全可以这样写。但是作为正规文件数据读写程序来说。

这些保存数据的方式是错误的。而且是非常危险的。

写文件程序和读文件程序在同一台电脑中不会看出问题。

一旦,一个程序在32位系统中,另一个程序在64位系统中,就可能出现问题。

或者一个计算机的处理器使用的大端字节优先序,另一个计算机的处理器使用小端字节优先序。或者,这两个程序使用不同版本的编译器编译。都会出错的。

这是因为,你将结构体直接以二进制序列方式保存到文件中,也就是说,你将结构体在内存的布局结构直接暴露在文件中。

因为,你在同一个编译器中编译两个程序,并且在同一台计算机上或者相同类型处理器的计算机,是看不出来问题。

不同编译器,对于同一个结构体内部的布局结构是不同的。即使同一个编译器自身设置不同,它也会生成不同布局结构的结构体。

32位程序的编译器与64位程序的编译器生成的结构体布局结构是不同的,因为默认对齐方式不同。

正确的方法应该,将结构体中各个成员,作为单个个体依次分别保存。

并且将各个成员的全部转换为文字型,char 型本身就是文字型所以无须转换。int 等需要转换成相应的字符串数据,然后输出。

并且同一变量中各个字段之间要加特殊的字符作为分割。例如Tab键。

而各条记录之间也需要加特殊的字符作为分割。例如回车键。

这样在保存成TXT文件时,你就可以看到能阅读的数据记录了。否则与int等数字型部分就可能是一串乱码。

在读取文件时,需要转移那两个特殊字符。

可以采用这样的方法,连续读取字符,直到遇到特殊字符,Tab和回车。

之前的多个字符作为一个整体,如果它对应的结构体的成员变量的数据类型是字符型(包括字符串),则验证它是否超过字符型的限制(比如是否超过规定字符串的长度)。如果对应的数值型,则需要专门的函数转换成相应的数值。比如文字型“31”需要转换成数字型“31”。

遇到回车,则表示之前的内容为一条记录(直到上一个回车),则后续将保存到新的记录中。

当然为了保证读取程序的建壮性,你需要能够识别出错误,记录的能力。

比如你的结构体包含四个成员,而某条数据记录只有三个字段,或者某条记录有五个字段。

结构体的成员明明是数字类型,而文件中对应记录的字段却无法正确的转换成数字类型。

同一条记录的各个字段之间有多个Tab,或各条记录之间有多个回车等等。

而读写函数用读取文字型的函数

写函数

int fprintf(FILE *stream, char *format, );

int fputs(char *string, FILE *steam);

int fputc(int ch, FILE *steam);

读函数

int fscanf(FILE *stream, char *format, );

char fgets(char *string, int n, FILE *steam);

int fgetc(FILE *steam);

00分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值