为什么fwrite写入的用fread读出再打印是乱码

aishilingdechengxu 2018-01-18 09:31:43
程序如下:#include<stdio.h>
typedef struct data
{
char xuehao[12];
char xingming[6];
int math;
int wuli;
int yuwen;
int huaxue;
}DA;
int main()
{
DA student[50];
DA student1[50];
int i=0;
FILE *fp=fopen("D:\\zuoye\\stu.txt","r");
while(!feof(fp))
{
fscanf(fp,"%s%s%d%d%d%d",student[i].xuehao,student[i].xingming,&student[i].math,&student[i].wuli,&student[i].yuwen,&student[i].huaxue);
i++;
}
//打印信息
// for(i=0;i<30;i++)
// printf("%s %s %d %d %d %d\n",student[i].xuehao,student[i].xingming,student[i].math,student[i].wuli,student[i].yuwen,student[i].huaxue);
fclose(fp);
FILE *fp1=fopen("D:\\zuoye\\stu.dat","w");
fwrite(student, sizeof(DA),30,fp1);
fclose(fp1);
FILE *fp2=fopen("D:\\zouye\\stu.dat","r");
for(i=0;i<30;i++)
{
fread(student1,sizeof(DA),1,fp2);
printf("%s %s %d %d %d %d\n",student1[i].xuehao,student1[i].xingming,student1[i].math,student1[i].wuli,student1[i].yuwen,student1[i].huaxue);
}
fclose(fp2);
}
我是将一些数据从一个txt中读出来了,再用二进制写到另一个文件中,再用fread读出来到一个数组中,打印这个数组却是乱码,求解啊!!!
数据格式就是这样的
201725003 董士杰 95 97 94 95
20172005 宁露露 92 94 91 92
20172501011 罗云龙 84 85 86 85
201721027 何明阳 91 95 92 92
20172037 庞景云 81 85 82 82
201721048 水海洋 84 88 90 87
201078 刘振强 85 86 87 86
201721089 张江坤 86 87 88 87
201099 高英豪 82 87 87 85
...全文
878 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-01-19
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
aishilingdechengxu 2018-01-19
  • 打赏
  • 举报
回复
引用 2 楼 自信男孩的回复:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

typedef struct data
{
	char xuehao[12];
	char xingming[6];
	int math;
	int wuli;
	int yuwen;
	int huaxue;
}DA;

int main()
{
	DA student[50];
	DA student1[50];
	int i=0;
	FILE *fp = fopen("D:\\zuoye\\stu.txt","r");
	if (!fp) {
		fprintf(stderr, "Open file error: %s\n", strerror(errno));
		exit(0);
	}

	while(!feof(fp))
	{
		fscanf(fp,"%s%s%d%d%d%d\n",
				student[i].xuehao,
				student[i].xingming,
				&student[i].math,
				&student[i].wuli,
				&student[i].yuwen,
				&student[i].huaxue);
		i++;
	}
	//打印信息 
	for(i=0;i<30;i++) {
		printf("%s  %s  %d  %d  %d  %d\n",
				student[i].xuehao,
				student[i].xingming,
				student[i].math,
				student[i].wuli,
				student[i].yuwen,
				student[i].huaxue);
	}
	fclose(fp);
	FILE *fp1 = fopen("D:\\zuoye\\stu.dat","w");
	if (!fp1) {
		fprintf(stderr, "Open file error: %s\n", strerror(errno));
		exit(0);
	}

	/*
	for(i=0;i<30;i++)
		fwrite(&student[i], sizeof(DA), 1, fp1);
		*/
	fwrite(student, sizeof(DA), 30, fp1);
	fclose(fp1);

	FILE *fp2 = fopen("D:\\zouye\\stu.dat","r");
	if (!fp2) {
		fprintf(stderr, "Open file error: %s\n", strerror(errno));
		exit(0);
	}

	for(i=0;i<30;i++)
	{
		fread(&student1[i],sizeof(DA),1,fp2);
		printf("%s  %s  %d  %d  %d  %d\n",
				student1[i].xuehao,
				student1[i].xingming,
				student1[i].math,
				student1[i].wuli,
				student1[i].yuwen,
				student1[i].huaxue);
	}

	fclose(fp2);
}
参考一下吧 有两个地方需要注意: 第一个地方,fscanf读,如果你的txt文件是每个学生信息占一行,那么fscanf读取时注意加'\n'; 第二个地方,也是主要的错误所在。fwrite没问题,一次性写了30个学生信息到文件中,但是读的时候有问题了,因为不是一次读30个学生信息,而是一次读一个学生信息,因此fread的第一个参数应该是&student1[i],而不是student1. 建议自己思考一下fread的第一个参数应该是什么
我又写了一边读二进制形式的文本代码,发现一样的代码,新的代码可以读出,谢谢大神了
自信男孩 2018-01-18
  • 打赏
  • 举报
回复
建议对文件的打开做判断,并且使用strerror(errno)会对调试有很大的帮助
自信男孩 2018-01-18
  • 打赏
  • 举报
回复
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

typedef struct data
{
	char xuehao[12];
	char xingming[6];
	int math;
	int wuli;
	int yuwen;
	int huaxue;
}DA;

int main()
{
	DA student[50];
	DA student1[50];
	int i=0;
	FILE *fp = fopen("D:\\zuoye\\stu.txt","r");
	if (!fp) {
		fprintf(stderr, "Open file error: %s\n", strerror(errno));
		exit(0);
	}

	while(!feof(fp))
	{
		fscanf(fp,"%s%s%d%d%d%d\n",
				student[i].xuehao,
				student[i].xingming,
				&student[i].math,
				&student[i].wuli,
				&student[i].yuwen,
				&student[i].huaxue);
		i++;
	}
	//打印信息 
	for(i=0;i<30;i++) {
		printf("%s  %s  %d  %d  %d  %d\n",
				student[i].xuehao,
				student[i].xingming,
				student[i].math,
				student[i].wuli,
				student[i].yuwen,
				student[i].huaxue);
	}
	fclose(fp);
	FILE *fp1 = fopen("D:\\zuoye\\stu.dat","w");
	if (!fp1) {
		fprintf(stderr, "Open file error: %s\n", strerror(errno));
		exit(0);
	}

	/*
	for(i=0;i<30;i++)
		fwrite(&student[i], sizeof(DA), 1, fp1);
		*/
	fwrite(student, sizeof(DA), 30, fp1);
	fclose(fp1);

	FILE *fp2 = fopen("D:\\zouye\\stu.dat","r");
	if (!fp2) {
		fprintf(stderr, "Open file error: %s\n", strerror(errno));
		exit(0);
	}

	for(i=0;i<30;i++)
	{
		fread(&student1[i],sizeof(DA),1,fp2);
		printf("%s  %s  %d  %d  %d  %d\n",
				student1[i].xuehao,
				student1[i].xingming,
				student1[i].math,
				student1[i].wuli,
				student1[i].yuwen,
				student1[i].huaxue);
	}

	fclose(fp2);
}
参考一下吧 有两个地方需要注意: 第一个地方,fscanf读,如果你的txt文件是每个学生信息占一行,那么fscanf读取时注意加'\n'; 第二个地方,也是主要的错误所在。fwrite没问题,一次性写了30个学生信息到文件中,但是读的时候有问题了,因为不是一次读30个学生信息,而是一次读一个学生信息,因此fread的第一个参数应该是&student1[i],而不是student1. 建议自己思考一下fread的第一个参数应该是什么
aishilingdechengxu 2018-01-18
  • 打赏
  • 举报
回复
求大神给解答,我很困扰啊。。。。。

69,369

社区成员

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

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