C语言文件操作中输出结构体乱码的问题

作者&投稿:融品 (若有异议请与网页底部的电邮联系)
C 语言,文件操作将结构体数组用fwrite写入文件后,打开时为什么文件中会是一堆乱码?~

注意你的写入语句:
fwrite(&s[i],sizeof(stu),1,fp);你这样是以二进制的形式将stu结构写入文件的。
typedef struct{char name[20];int score[M];double avg;}stu;应该用fprintf函数分三次完成一个记录的输出:
fprintf(fp,"%s", s[i].name);int j; //在前面补充定义for(j=0;j < M;j++) fprintf(fp,"%d", s[i].score[j]);fprintf(fp,"%f
", s[i].avg); 对应的fread也要修改。我改好了传上来。

#include#include#include#define N 20#define M 3typedef struct{char name[20];int score[M];double avg;}stu;void swap(stu*m,stu*n){stu t=*m;*m=*n;*n=t;}void input(stu*s,int n){int i,j;double sum=0;for(i=0;i<n;i++){printf("请输入姓名:");scanf("%s",s[i].name);printf("请输入分数(英语数C):");for(j=0;j<M;j++)scanf("%d",&s[i].score[j]);printf("
");}}void sort(stu*s,int n){int i,j;double sum=0;for(i=0;i<n;i++){for(j=0;j<M;j++)sum+=s[i].score[j];s[i].avg=sum/M;sum=0;}for(i=1;i<n;i++)for(j=0;j<n-i;j++){if(s[j].avg<s[j+1].avg)swap(&s[j],&s[j+1]);else if((s[j].avg==s[j+1].avg)&&(strcmp(s[j].name,s[j+1].name)<0))swap(&s[j],&s[j+1]);}}void save(stu*s,int n){FILE*fp;int i, j;fp=fopen("d:\\data.dat","w");for(i=0;i<n;i++){//fwrite(&s[i],sizeof(stu),1,fp);fprintf(fp,"%s", s[i].name);for(j=0;j < M;j++) fprintf(fp,"%d", s[i].score[j]);fprintf(fp,"%f
", s[i].avg);}fclose(fp);}void output(stu*s,int n){int i=0,j;FILE*fp;if((fp=fopen("d:\\data.dat","r"))==NULL){printf("fail
");exit(0);}while(!feof(fp)){//fread(&s[i],sizeof(stu),1,fp);fscanf(fp, "%s",s[i].name);for(j=0;j<M; j++) fscanf(fp,"%d", &s[i].score[j]);fscanf(fp, "%f",&s[i].avg);i++;}fclose(fp);for(i=0;i<n;i++){printf("%s",s[i].name);for(j=0;j<M;j++)printf("%d ",s[i].score[j]);printf("%.1lf",s[i].avg);printf("
");}}void main(){int n;stu s[N];printf("input n:");scanf("%d",&n);input(s,n);sort(s,n);save(s,n);output(s,n);}


fwrite是将内存中的数据不经转换直接写入文件,所以文件中保存的是二进制形式,当然看到乱码了。
你可以试试:
fprintf(fp1,"%s%s%s%s%s%s",copy1.title,copy1.copies,copy1.rental_duration,copy1.director,copy1.actor,copy1.genre);

另外,输入字符串时,不用取地址。
scanf("%s%s%s%s%s%s",copy1.title,copy1.copies,copy1.rental_duration,copy1.director,copy1.actor,copy1.genre);

详细可以看看
http://zhidao.baidu.com/question/43885020.html

你的out.txt的内容是你自己打进去的,不是用fwrite写进去的,而且你结构中还包含了,什么的,如果你的内容是用fwrite写进去的就可以用fread读了,
它们是要配合使用的。

别取巧啦。。
struct student_type
{char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
问题在于它的内容比有效的内容大很多。所以读入的时候,把下个记录的内容也读进来了。
用空格和逗号作分隔,一个一个读取吧。

你读的时候是按照结构体大小去读的,但是你的数据并不是和你的结构体长度对齐的,比如你用来保存名字的大小是10个字节,但是实际你文本中的名字只有3个字节,这样后面的2002之类的也都保存到char name[10];中了,明白?
修改方法有两个,一个是做成文本对齐的格式,就是文本文件中字符串总是和你定义的结构体中数组的长度一致,不够的补空格,另一个就是用fscanf来替代fread。

标出来错的位置了 自己改吧

#include <stdio.h>
#include<conio.h>
#define SIZE 4

struct student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];

void main()
{
FILE *out;
int i=1;

out=fopen("out.txt","r");

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

{
fread(&stud[i],sizeof(struct student_type),1,out); //长度过大,很明显你没有用到sizeof(struct student_type)这么长,因为名字和地址并没有用满整个字符数组,你定义char name[3];char addr[7];再运行看看就知道了
printf("%-10s,%4d,%4d,%-15s\0\n", stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
fclose(out);
getch();

}

好难啊 我自己也看不懂。。。

yo,加分了,给我留着


c语言如何读取文件并输出
1、C语言标准库提供了一系列文件操作函数。文件操作函数一般以f+单词的形式来命名(f是file的简写),其声明位于stdio.h头文件当中。例如:fopen、fclose函数用于文件打开与关闭;fscanf、fgets函数用于文件读取;fprintf、fputs函数用于文件写入;ftell、fseek函数用于文件操作位置的获取与设置。2、例程:include...

C语言的输出与输入
在C语言中,所有的设备都被当作文件处理,这包括了屏幕和打印机等。程序执行时,三个默认的文件(键盘、屏幕和标准错误输出)会自动打开,以便进行输入和输出操作。文件指针用于访问文件,通过它可以在屏幕或文件中读取或写入数据。在C语言中,输入输出通常涉及`stdio.h`头文件中的`printf()`和`scanf()...

C语言文件操作中输出结构体乱码的问题
你的out.txt的内容是你自己打进去的,不是用fwrite写进去的,而且你结构中还包含了,什么的,如果你的内容是用fwrite写进去的就可以用fread读了,它们是要配合使用的。

C语言文件操作中fgetc和getc有什么区别?
主要区别就是输入输出的格式,简单来说就是fgetc是获取一串字符而getc就是获取一组字符,同样地可以理解fputc和putc的意思是相通的,一般fgetc和fputc所输入输出的字符类型通常都是long型,而getc和putc输入输出的字符类型则根据return返回值而定。

计算机c语言中 main() { FILE *f; f=fopen("filea.txt","
FILE *f; \/\/定义文件指针, 名字叫做f f = fopen("filea.txt", "w"); \/\/把f指针指向打开的filea.txt文本, 文件操作类型属于输出 fprintf(f, "abc"); \/\/文件输出, 输出在指针f所指向的文件里, 输出内容为abc fclose(f); \/\/关闭文件f, 对应的是上面的fopen, 如果不关闭的话程序可能...

c语言程序由什么组成
C语言的字符串其实就是以字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。6、文件输入\/输出:在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件stdio.h;中。

要怎么才能在c语言中保存输出文件?
建议你看下C语言文件这部分,fopen这个函数就是打开文件,如果没有就会创建,然后用 fscanf(fp,"%s",buf);这个函数就是将数据写入文件中,会自动保存。

C语言输出文件
C语言输入输出函数 1. fopen()函数 fopen函数用于打开文件, 其调用格式为: FILE *fopen(char *filename, *type); 在介绍这个函数之;前, 先了解一下下面的知识。 (1) 流(stream)和文件(file) 流和文件在Turbo C2.0中是有区别的, Turbo C2.0 为编程者和被访问的设 备之间提供了一层抽象的东西, 称...

c语言中其中实线表示操作流程,虚线表示文件的输入输出 其他表示什么...
这是图 1-1 C 程序运行步骤图的图例解释而已。其他都是流程图的常规使用。

汇编语言中 从屏幕上输出一个字符
1、打开软件,出现下图的界面,可以直接进行编程。2、汇编语言的数据需要存放在特定的数据端位置。如字符串“hello world!”,db代表的是一个字节(8位数据位)。3、$ 表示一个字符串的结束,字符串要用单引号括起来。在代码中相应位置输入如图中的代码。4、在中间代码编写区域输入下图中相应的代码,...

深圳市17040671783: 为什么我这个C语言代码将明码的文件读取到结构体中时总显示乱码? -
菜昂海替: 你的文件中的数据,不是用fwrite(结构体)这种方式写到文件中去的 所以,你用fread(&students[i],nLine,1,fp); 是不能正确读到数据的!试一下如下代码:#include<stdio.h>#include<string.h> struct student { char num[13]; //---12位的整数会越界...

深圳市17040671783: C语言文件输出时,输入数据后为什么会出现乱码 -
菜昂海替: 可能是输入缓冲区之前未清空 使用这个函数将文件缓冲区清空 memset(buffer,0,sizeof(buffer)); 头文件在#include中

深圳市17040671783: 小弟最近在学C语言,用C语言将简单的结构体写入扩展名为txt的记事本文件后,用记事本打开却是乱码,为什么 -
菜昂海替: 你写入txt文件中是以文本形式存的,还有一种是二进制形式存储.你要看好自己以什么形式存储.乱码不代表就是不对.有可能你是二进制存储,但是你以文本来查看,那就不对了啊.

深圳市17040671783: C程序结构体输出出现乱码 -
菜昂海替: F:\c_work>a.exe 请输入:aaa 10001 //错误的输入 请输入:aaa,010001,0 F:\c_work>a.exe 请输入:aaa,10001 //正确的输入,要加英文逗号 请输入:bbb,10002 aaa,10001,0 bbb,10002,0 scanf("%s,%d",student[i].name,&student[i].num); //%s,%d中间有逗号

深圳市17040671783: C语言中写文件,为什么写出的是乱码呢,求大 -
菜昂海替: fp=fopen("stud.dat","wb"); //你建立的是二进制文件,这种文件用记事本打开就是乱码,这是正常的.

深圳市17040671783: c语言 txt文件怎么输出老是乱码 -
菜昂海替: fwrite用于二进制写入,怎样写对于数据来说都是乱码,而对于字符则能正常输出,而对于结构体,最好使用格式输出函数fprintf()与fscanf(),这样可以保证输出的正确性,而fwrite函数时将内存中的二进制数据直接写入文本文件,像11001010这样的,所以文本文档当然会显示乱码了 .

深圳市17040671783: C语言读入写出文件,写出文件时出现个别乱码. -
菜昂海替: 出问题的原因是你ftell得到的长度和你fread实际读到的字节数不符,原因是windows把回车看作/r/n2个字符,ftell读的时候也按2个算,但是fread读的时候却算一个,就是\n ,这就导致你fwrite的时候比你fread到的要多. 解决办法就是你可以定义一个额外的整数n来记录读到的字符数,并把下面2句改成这样: /*把文件拷贝到buffer中*/n=fread(buffer,1,lSize,pFile);/*写入新文件中*/fwrite(buffer,1,n,newFile);你可以先不改然后把测试文件内容删到只剩下一行,就不会出这个问题

深圳市17040671783: (C语言)把结构体的数据存到TXT文件中,为什么打开TXT记事本显示是乱码呢? -
菜昂海替: 结构体读写是根据结构定义的数据类型的大小进行存储,如整数是2个字节,文件的大小固定,与文件的扩展名无关.如果需要保存为TXT格式,需要用文本读写的方式,文件的大小不固定.例如下面程序的区别. #include "stdio.h" #include ...

深圳市17040671783: c语言 lc[i]是一个结构体组 想问为什么我结构体中的字符串为空 读出时读出了一堆乱码 文件却什么都没有 -
菜昂海替: (1) lc[i]是一个结构体组, 程序中没有体现出来.假定是 ST 型,百那么声明中要有类似:struct ST lc[10],st; 这样的声明,而不是 struct lc st; fread(&st,sizeof(struct lc),1,fp); 里 要用 sizeof(struct ST), 而不是 sizeof(struct lc),(2)要度读文件,文件...

深圳市17040671783: C语言写入的文件出现乱码,请各位帮帮忙,下面是代码 -
菜昂海替: 因为你是以二进制方式把结构体数据写到文件中,所以如果你用记事本打开来查看保存的文件,自然看到是乱码.只有你自己写的程序才可正确地读取和显示结果,当然你得写对.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网