c语言文件操作fwrite和fread

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言文件操作fwrite和fread相关的知识,希望对你有一定的参考价值。

#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);则输出出错,
怎么回事这是 ,谢谢

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;
参考技术A 无语的写法..
你根本分不清什么事数字 什么事字符

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

char buf[1024];

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

printf 改成 printf(%s, buf);

如果你要把 txt里面的字符变成数据.
那就需要解析txt了
参考技术B 读了你的代码,我觉得,你在用fread的时候,其实你的意图是想将1.txt中的每一行按照你所定义的structure student中的字段格式,进行读取,将你的stud一个一个填充好。很遗憾,fread并不能做这件事情。fread会将1.txt中的每行看做一整个字符串,写到你给的每个&stud[j]开头的地址空间中,而无视你所给定的structure的定义,自然你printf就得不到预想的结果了。而fwrite倒是可以原原本本将写入的字串回写出来。
如果你想要按structure的格式读入1.txt的数据,那么就要用scanf咯。就像printf那样,scanf的用法你一定是懂的。本回答被提问者采纳

c语言中fgets 、fputs、fread、fscanf、fseek的区别和作用

fread:是读取数据
fwrite:是写入数据
1.函数功能
用来读写一个数据块。
2.一般调用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
3.说明
(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项;
(4)fp:文件型指针。
注意:1
完成次写操(fwrite())作后必须关闭流(fclose());
2
完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(file
*
fp)自动向后移动前一次读写的长度,不关闭流继续下一次读操作则接着上次的输出继续输出;
3
fprintf()

按格式输入到流,其原型是int
fprintf(file
*stream,
const
char
*format[,
argument,
...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了。注意的是返回值为此次操作写入到文件的字节数。如int
c
=
fprintf(fp,
"%s
%s
%d
%f",
str1,str2,
a,
b)
;str1:10字节;str2:
10字节;a:2字节;b:8字节,c为33,因为写入时不同的数据间自动加入一个空格。
4.fscanf

scanf
相似
:当能正常读入数据时,
fscanf
返回读入数据的个数,否则返回
eof
参考技术A fgets()从文件读取一个字符串
fputs()将一个字符串输出到文件
fread()从文件以二进制方式读取数据
fscanf()是scanf()的文件版本
fseek()将文件指针定位到文件中需要的位置本回答被提问者采纳

以上是关于c语言文件操作fwrite和fread的主要内容,如果未能解决你的问题,请参考以下文章

C 语言文件操作 ( fread 函数 )

C 语言文件操作 ( 按照内存块的方式读写文件 | fread 函数 | fwrite 函数 )

C 语言文件操作 ( 使用 fread 和 fwrite 实现二进制文件的拷贝 | stat 统计文件大小 | feof 判定文件结尾 )

fread函数

缓冲文件系统(fopen/fread/fwrite)和非缓冲文件系统(open/read/write)

缓冲文件系统(fopen/fread/fwrite)和非缓冲文件系统(open/read/write)