c语言文件操作fwrite和fread

#include<stdio.h>#include<stdlib.h>structstudent{charname[10];charnum[10];intscore[3]... #include<stdio.h>
#include<stdlib.h>
struct student
{
char name[10];
char num[10];
int score[3];
float aver;
}stud[5];
void main()
{
FILE *fp1;
int j=0;
if((fp1=fopen("d:\\test\\1.txt","rb"))==NULL)
{printf("Wrong!");exit(0);}
while(!feof(fp1))
{
fread(&stud[j],sizeof(struct student),1,fp1);
//输出
j++;
}
}
d:\test\1.txt中文件为:
jim 001 12 34 45 30.333333
kate 002 23 34 45 34.000000
tom 003 44 55 66 55.000000
lucy 004 55 66 66 62.333333
uuu 005 45 65 45 51.666667
问题是输出处用:fwrite(&stud[j],sizeof(struct student),1,stdout);正确
用: printf("%s %s %d %d %d %f\n",stud[j].name,stud[j].num,stud[j].score[0],stud[j].score[1],stud[j].score[2],stud[j].aver);则输出出错,
怎么回事这是 ,谢谢
展开
 我来答
吉祥二进制
高粉答主

2015-05-24 · 科技改变生活,生活改变科技。
吉祥二进制
采纳数:33926 获赞数:84579

向TA提问 私信TA
展开全部

fread是C语言标准为中的一个函数。它从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。

fwrite是C语言标准库中的一个函数,指向文件写入一个数据块。示例如下:

//读取一个完整的文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE* pFile;   //文件指针
    long lSize;   // 用于文件长度
    char* buffer; // 文件缓冲区指针
    size_t result;  // 返回值是读取的内容数量
    pFile = fopen("myfile.bin" , "rb");
    if (pFile == NULL) {fputs("File error", stderr); exit(1);}    // 如果文件错误,退出1
    // 获得文件大小
    fseek(pFile , 0 , SEEK_END); // 指针移到文件末位
    lSize = ftell(pFile);  // 获得文件长度
    rewind(pFile);  // 函数rewind()把文件指针移到由stream(流)指定的开始处, 同时清除和流相关的错误和EOF标记
    // 为整个文件分配内存缓冲区
    buffer = (char*) malloc(sizeof(char) * lSize); // 分配缓冲区,按前面的 lSize
    if (buffer == NULL) {fputs("Memory error", stderr); exit(2);}  // 内存分配错误,退出2
    //  该文件复制到缓冲区
    result = fread(buffer, 1, lSize, pFile); // 返回值是读取的内容数量
    if (result != lSize) {fputs("Reading error", stderr); exit(3);} // 返回值如果不和文件大小,读错误
 
    // terminate // 文件终止
    fclose(pFile);
    free(buffer);
    return 0;
}

综合使用的例子。

#include <stdio.h>
int main()
{
    FILE* pFile;
    float buffer[] = { 2.0 , 3.0 , 8.0 };
    pFile = fopen("myfile.bin" , "wb"); // 打开文件写操作
    fwrite(buffer , 1 , sizeof(buffer) , pFile); // 把浮点数组写到文件 myfile.bin
    fclose(pFile); // 关闭文件
    float read[3];
    pFile = fopen("myfile.bin" , "rb"); // 重新打开文件读操作
    fread(read , 1 , sizeof(read) , pFile); // 从文件中读数据
    printf("%f\t%f\t%f\n", read[0], read[1], read[2]);
    fclose(pFile); // 关闭文件
    return 0;
}
百度网友0ad5d59
2009-09-14 · TA获得超过1192个赞
知道小有建树答主
回答量:378
采纳率:0%
帮助的人:571万
展开全部
无语的写法..
你根本分不清什么事数字 什么事字符

如果你要输出txt里面的内容比较简单.

char buf[1024];

fread(&stud[j],sizeof(struct student),1,fp1);
改成
fread(buf,1024,1,fp1);

printf 改成 printf(%s, buf);

如果你要把 txt里面的字符变成数据.
那就需要解析txt了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友d9b7d5fb9
2009-09-16 · TA获得超过109个赞
知道答主
回答量:108
采纳率:0%
帮助的人:105万
展开全部
读了你的代码,我觉得,你在用fread的时候,其实你的意图是想将1.txt中的每一行按照你所定义的structure student中的字段格式,进行读取,将你的stud一个一个填充好。很遗憾,fread并不能做这件事情。fread会将1.txt中的每行看做一整个字符串,写到你给的每个&stud[j]开头的地址空间中,而无视你所给定的structure的定义,自然你printf就得不到预想的结果了。而fwrite倒是可以原原本本将写入的字串回写出来。
如果你想要按structure的格式读入1.txt的数据,那么就要用scanf咯。就像printf那样,scanf的用法你一定是懂的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式