首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在c中使用fread时,为什么要将结构转换为char*?

在C语言中,使用fread时,需要将结构体转换为char,是因为fread函数的参数需要是一个指向字节数组的指针。将结构体转换为char可以确保fread能够正确地读取结构体的内存数据。

以下是一个简单的示例:

代码语言:c
复制
#include<stdio.h>
#include <stdlib.h>

typedef struct {
    int a;
    int b;
} MyStruct;

int main() {
    MyStruct s;
    s.a = 1;
    s.b = 2;

    FILE *f = fopen("data.bin", "wb");
    if (f == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fwrite(&s, sizeof(MyStruct), 1, f);
    fclose(f);

    f = fopen("data.bin", "rb");
    if (f == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    MyStruct s2;
    fread((char*)&s2, sizeof(MyStruct), 1, f);
    fclose(f);

    printf("s.a = %d, s.b = %d\n", s2.a, s2.b);

    return 0;
}

在上面的示例中,我们将结构体s写入文件data.bin,然后使用fread读取文件中的数据,并将其存储在结构体s2中。为了使fread正确地读取数据,我们将结构体s2的地址转换为char*。

需要注意的是,在使用fread时,我们需要确保结构体中的字段是连续存储的,否则可能会导致读取错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C文件读写

但是,为了适配各系统下的惯例,C语言写入、读取文件,若系统惯例与C语言使用的不一致,则会自动进行转换。 Linux系统和C语言采用同一种惯例\n,无需转换。...二进制模式 如果,不希望C语言把对文件输入输出的数据当做文本,不进行换行时的自动转换。可以在打开文件使用二进制模式。函数fopen的第二个参数的字符串添加字符b,代表二进制binary。...fflush函数 C语言中提供的文件操作函数是带有缓存的,数据会先写入到缓存。待缓存的数据积累到一定数量,再一起写入文件。因此,刚刚暂停,数据还在缓存区内,未写入到文件当中。...文件从读操作转换为写操作前,必须使用fseek,rewind其中一个函数。 代码读写操作转换的地方加入必要函数。如果仅需要读写操作转换,但无需变动文件指针。可以在当前位置处偏移0字节。...写,可以使用fflush或fseek偏移0字节。 运行后,文件的字符H已修改为小写的h。

3.6K20

C文件读写

但是,为了适配各系统下的惯例,C语言写入、读取文件,若系统惯例与C语言使用的不一致,则会自动进行转换。 Linux系统和C语言采用同一种惯例\n,无需转换。...C语言Windows系统上写入文件,会将\n写入为\r、\n。而读取文件,会将\r、\n读取为\n。 如果在windows系统上运行刚刚的代码,文件内换行将是\r、\n两个字符。...二进制模式 如果,不希望C语言把对文件输入输出的数据当做文本,不进行换行时的自动转换。可以在打开文件使用二进制模式。函数fopen的第二个参数的字符串添加字符b,代表二进制binary。...文件从读操作转换为写操作前,必须使用fseek,rewind其中一个函数。 代码读写操作转换的地方加入必要函数。如果仅需要读写操作转换,但无需变动文件指针。可以在当前位置处偏移0字节。...写,可以使用fflush或fseek偏移0字节。 运行后,文件的字符H已修改为小写的h。

3.3K00

C-文件操作】一文教你如何将代码的数据持久化

目录 1.为什么使用文件? 2.什么是文件?...和fwrite  5.文件的随机读写 6.文本文件和二进制文件  7.文件读取结束的判定  8.文件缓冲区 ---- 1.为什么使用文件?...\n换行 对于fgets是一次读取一行字符串,如果有多行则需要使用多次fgets 关于打开或写入等等失败的返回值问题,看函数原型: 函数原型返回值的类型为int,一般以EOF作为失败的返回值...( FILE *stream, const char *format [, argument ]...); 备注,这里和后面的fscanf都和原来我们学过的printf和scanf类似,只是参数列表添加了一个参数...,当内存向磁盘输出数据会先送到内存的缓冲区,满缓冲区后才一起送到磁盘上,从磁盘输出数据也类似。

71530

CC语言文件(包括:文件各种读写方式)「建议收藏」

文件的指针不是指向一段内存空间,而是指向描述有关这个文件的相关信息的一个文件信息结构体,该结构体定义studio.h头文件。...当然,也无需了解有关此结构体的详细细节,只需要知道如何使用文件指针就行了。...声明文件指针变量的一般形式为: FILE* 文件型指针变量名; 其中,FILE应为大写;它实际上是由系统定义的一个结构体,该结构包含了文件名、文件使用方式、当前位置等信息。...文件的打开与关闭 C语言规定,任何文件使用之前必须打开,使用之后必须关闭。对文件的操作都是通过标准函数来实现的。...但由于输入时需要将ASCII码转换为二进制格式,输出要将二进制格式转换为字符,花费时间较长,所以在内存与磁盘交换数据频繁的时候,最好不要用这两个函数。

1.3K20

C语言读写程序文件-学习三十二

顺序读写数据文件顺序写,先写入的数据存放在文件前面,后写入的数据存放在文件后面。顺序读,先读文件前面的数据,后读文件后面的数据。...fputc()函数原型:int fputc( int c, FILE *fp );调用形式:fputc(c,fp)功能:把参数 c 的字符值写入到 fp 所指向的输出流(文件)。...说明:fgets(str,n,fp); n 是要求得到的字符个数,但实际上只读 n-1 个字符,然后最后加一个**\0**字符,这样得到的字符串共有n个字符,把它们放到字符数组str。...,容易理解,但是由于输入时要将ASCII码转换为二进制形式,输出要将二进制形式转换符,花费时间比较多。...clearerr 函数或 rewind 函数,或任何其他一个输入输出函数----------总结在使用文件,首先要定义一个文件指针:FILE *fp;然后通过该指针来操作相应的文件;通过fopen这个函数

90240

C语言——文件操作

在读取文件,可以使用循环结构来读取文件的所有字符,直到读取到文件结尾或出现错误为止。...如果想将字符串输出到文件,只需要将 stdout 替换为自定义的文件指针即可。 7.fread read() 函数是用于从文件读取二进制数据(如图像,音频等)的标准C函数。...使用 fread() 函数,需要先打开文件(可以使用 fopen() 函数),然后使用 fread() 函数从文件读取数据。要读取的数据项数是 count,每个数据项的大小是 size。...feof函数的使用一般结合文件读取函数(如fgetc、fgets、fread等)来判断文件读取是否已经结束。 牢记:文件读取过程,不能用feof函数的返回值直接用来判断文件的是否结束。...进行文件读写,数据会先被读入到内存的文件缓冲区,然后再由文件缓冲区输出到外存上。文件缓冲区存在的目的是为了提高文件读写的效率,因为与直接读写外存相比,内存的读写速度更快。

9110

C语言实现读取文件的简单代码「建议收藏」

(5)在打开一个文件,如果出错,fopen将返回一个空指针值NULL。程序可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。..."); exit(1); } (6)把一个文本文件读入内存要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间...feof(fRead)) //feof函数 { printf("%c", fgetc(fRead)); } fclose(fRead); } int main() { function(.../字符数组 argument ]... ); fprintf() 失败返回‘-1’ 参考资料: C语言中fscanf函数 其中fscanf函数的返回值为:参数列表中被成功赋值的参数个数;失败,...size, //要写入项目的大小,以字节为单位 size_t count, //要写入的最大项目数 FILE *stream //指向FILE结构的指针 ); size_t fread

2.5K30

练习所学文件操作的相关函数

这些信息是保存在⼀个结构体变量的。该结构体类型是由系统声明的,取名FILE。...可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变量)。通过该⽂件信息区的信息就能够访问该⽂件。也就是说,通过⽂件指针变量能够间接找到与它关联的⽂件。 如图所示,我们文件里写入成功了。 ...使用 fread 函数从文件读取26个字节到 buffer 数组。 关闭文件。... buffer 的第27个位置(索引为26)添加一个空字符(null terminator)\0,以确保 buffer 是一个合法的C字符串。 使用 printf 打印 buffer 的内容。...使用 fread 读取,会读取这26个字符。 但是,这里有一个问题。fread 读取的字节不会转换为字符串的终止符,因此添加 \0 之前,buffer 并不是一个合法的C字符串。

8610

C语言】文件相关操作

3、为什么使用文件 我们前面学习了结构体和动态内存管理的相关知识,假设我们现在要利用这些知识要写一个通讯录的小程序,当通讯录运行起来的时候,可以给通讯录增加、删除数据,此时数据是存放在内存,当程序退出的时候...4、文件的打开和关闭 文件指针 每个被使用的文件都会在内存开辟一个对应的文件信息区,用来存放文件的相关信息(如文件的名字,状态及当前的位置等);这些信息被保存在一个结构体变量,该结构体类型被系统声明为...函数功能 sscanf:将一个字符串的数据格式化;sprintf:将一组格式化的数据转换为字符串; 函数参数 int sscanf( const char *buffer, const char *format...struct Stu stu = { "zhangsan", 20, "nan" }; char str[50]; //定义一个字符数组,用来存储从结构读取的数据 //将一组格式化的数据转换为字符串...feof 文件的使用,feof 函数的返回值常被错误的认为是用来判断文件是否读取结束的,其实,文件读取过程,feof 函数的返回值并不能直接用来判断文件是否结束,而是应当用于文件读取结束的时候

2.9K00

C语言】看了这篇文章,如果你还不会文件操作的话,我把这篇文章给吃了(doge)

→ 讲解desu ​​​​​​​文件读取结束的判定​​​​​​​ 错误使用 feof()  文件缓冲区 最后  ---- 为什么使用文件 首先来说下为什么使用文件操作吧,在前面的内容写过一篇通讯录的文章...每当我们打开一个文件的时候,系统会根据文件的情况自动会创建一个FILE结构的变量,并进行填充其中的信息。当然我们使用的时候无需关心这些。...大多数库实现,errno变量失败也被设置为特定于系统的错误代码。 那么在演示 fopen() 打开文件的示例之前,我们先了解下什么是关闭文件。...一个文件的数据可能出现在存储器层次的不同级别,例如,一个文件数据通常被存储辅存(如硬盘),当其需要运行或被访问,就必须调入主存,也可以暂时存放在主存的。...磁盘高速缓存当中大容量的辅存常常使用磁盘,磁盘数据经常备份到磁带或可移动磁盘组上,以防止硬盘故障丢失数据。有些系统自动地把老文件数据从辅存储到海量存储器,如磁带上,这样做还能降低存储价格。

80620

C语言从入门到实战——文件操作

fclose(fp); 进行文件操作,需要注意以下几点: 在打开文件之前要确保文件存在,或者在打开文件使用合适的打开方式。...一、 为什么使用文件 如果没有文件,我们写的程序的数据是存储电脑的内存,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件...C语言中,使用文件操作函数打开、读取和写入文件,需要提供文件的路径作为参数。使用绝对路径可以确保准确找到文件,而使用相对路径可以简化文件路径的书写。...fread C 语言中,fread 函数用于从文件读取指定数量的数据,并将其存储到缓冲区。...然后,使用 fread 函数从文件读取 5 个整数,将其存储 numbers 数组。最后,使用循环输出读取到的整数。

24610

C语言】文件操作

本文介绍了C语言中关于文件操作的内容知识,内容较为生涩,没有理解可以多次观看 ---- ---- 一、为什么使用文件 我们写代码的过程,有的时候某一些数据我们是想把它保存下来的,而不是说只有程序运行的时候...,这些数据才能被我们录入或显示出来,我们总会遇到数据持久化的场景,所以这时我们需要将数据保存下来,一般数据持久化的方式有,把数据存到磁盘文件里,或存放到数据库里面 以后我们如果想导出这部分的数据,只要打开磁盘的文件就行了...举个栗子: 我们程序中使用到的文件都会开辟一个文件信息区(存放文件信息),这些存在于系统声明的信息都是由编译器的开发人员(微软员工)定义好类型的,并且该结构体的类型声明为FILE(源码利用FILE...每当我们打开一个文件,系统会根据文件的情况自动创建一个FILE类型的结构体变量,用于填充我们文件情况的信息,我们使用时,直接使用就好了,不必关心操作系统是如何操作的 所以我们就可以定义一个文件指针变量...scanf或printf我们只需要向其中输入数据让printf显示器里显示出来就可以了,但其实这两个函数只是使用了默认输入流(键盘)和输出流设备(屏幕显示器),scanf: Read formatted

3.8K10

C文件操作1】如何写入读取?fopen的6种组合参数怎么用?

C语言中文件操作,即文件打开,文件写入、文件读取、文件关闭等。 使用这些功能,需要了解其基本的使用规则,如: 文件读写前,必须先使用fopen函数打开文件。...使用fopen打开,还要指明文件的打开的参数,是要读呢还是写呢?...这些参数如果不注意,比如直接使用"w"参数打开一个已存在的文件,则里面的内容会先被清空,如果还想要之前的文件的内容,那也已经被清空了!.../*使用malloc申请一块内存*/ pRawData = (unsigned char *)malloc(sizeof(int) * DATA_SIZE); /*将该块内存强制转换为.../*定义结构体*/ typedef struct { char name[256]; unsigned int page; float price; }BOOK; /*声明实例化一个结构体对象

1.8K50

C进阶:文件的基础操作

); 3.这些信息是保存在一个结构体变量的。...例如: 二.文件的打开和关闭 1.文件的打开 打开文件我们需要使用到 fopen 函数; 让我们看看 fopen 在库函数的声明: 1.需要头文件 ; 2.参数 const char...当读取 (n-1) 个字符,或者读取到换行符,或者到达文件末尾,它会停止,具体视情况而定; 2.参数 char *str :这是指向一个字符数组的指针,该数组存储了要读取的字符串; 3.参数...首先牢记:文件读取过程,不能用feof函数的返回值直接用来判断文件的是否结束。...因为有缓冲区的存在,C语言操作文件的时候,需要做刷新缓冲区或者文件操作结束的时候关闭文件。

10310

CCPP输入输出函数汇总分析

补充:函数返回下一个字符,会将其unsigned char类型转换为int类型。为不带符号的理由是,如果最高位是1也不会使返回值为负。...所指的流取1行字符-标准输入流(由fp=stdin所指) 原因:同上; 补充:不推荐使用,问题是调用者使用gets,不能指定缓冲区buf(用户进程)的长度,这样可能造成缓冲区溢出。...该函数C++标准库已不存在,并被证明是不安全的,因为它不对读取的数据进行长度限制,这可能导致缓冲区溢出。因此,应该使用替代函数,例如fgets()或cin。...而对于一次一行的方式,当每次结构体中有null字符,fputs就会停止,所以也不能用它实现读结构,同时fgets包含有null字节或换行符,其也不能正常工作。...其原因是:结构,同一成员偏移量可能因为编译器和系统而异,另外,用来存储多字节整数和浮点值的二进制格式不同的机器体系结构之间也可能不同。 fread() 函数是 C 语言的标准 I/O 库函数。

1.8K20

复习C中文件操作

C语言中的文件接口 1、打开文件 FILE* fopen(const char* filename, const char* mode); // filename为文件名,若不加路径的话且该文件不存在的话则会在当前目录下创建该文件...** 所有输出流 将字符串转换为格式化数据 fscanf(FILE stream, const char format, …)** 所有输入流 将格式化数据转换为字符串 fprintf(FILE stream...C语言文件接口的使用及细节 以 “w” 的方式单纯打开文件,那么该文件的内容会被 清空!...当以 “w” 方式打开文件,它会建立一个新文件,它的 默认权限是0664(因为权限掩码umask为0666) 使用 fgets() 或者 fgetc() 时候,我们是按回车结束,而回车键也会被放到缓冲区内...下面的代码 strlen(msg) + 1 -> 乱码,也就是把 ‘\0’ 也追加会造成,因为 ‘\0’ 是 C 的规定,和文件无关。

15220

C语言文件

一、文件缓冲区 C程序运行时,数据并不是直接保存到文件的,也不是直接从文件打印到屏幕上,中间有个缓冲区,示意图如下: 这里的硬盘是指的文件。 fflush/fclose都有刷新缓冲区的作用。...二、文件读取结束原因 C语言文件,主要使用feof、ferror两个函数来判断文件读取结束的原因。...\n"); } //关闭文件 fclose(p); p = NULL; return 0; } 输出结果为: 三、文件内容和数据互转 想要将文件内容和某种类型的数据互相转换...ptr:结构体指针 size:需要转换的字节大小 count:需要转换的元素个数 stream:文件指针 例如: #include typedef struct stu {...文件 二进制输出函数 fwrite 文件 注: 读取文本判断是否结束, fgetc看返回值是否为EOF; fgets看返回值是否为NULL。

17630

c语言fread6,c语言中fread的用法「建议收藏」

如果当前读写位置已经文件末尾了,或者读文件出错了,则fread返回0。如果写文件出错了,则fwrite的返回值小于nmemb指定的值。...下面的例子由两个程序组成,一个程序把结构体保存到文件,另一个程序和从文件读出结构fread的例子程序如下: /* -------------------writerec.c-----------...该程序生成的recfile文件是二进制文件而非文本文件,因为其 不仅保存着字符型数据,还保存着整型数据24和28(od命令的输出以八进制显示为030和034)。...注意,直接在文件读写结构体的程序是不可移植的,如果在一种平台上编译运行writebin.c程序, 把生成的recfile文件拷到另一种平台并在该平台上编译运行readbin.c程序,则不能保证正确读出...文件的内容,因为不同平台的大小端可能不同(因而对整型数据的存储方式不同),结构体的填充方式 也可能不同(因而同一个结构体所占的字节数可能不同,age成员name成员之后的什么位置也可能不同)。

72420

C】语言文件操作(一)

本章重点 : 为什么使用文件 什么是文件 文件的打开和关闭 文件的顺序读写 文件的随机读写 文本文件和二进制文件 文件读取结束的判定 文件缓冲区 因内容比较多,为方便大家吸收,这一篇只介绍1,2,3,4...的内容, 剩下内容将放到【C】语言文件操作 (二)中介绍 1.为什么使用文件 使用文件可以将数据直接存放在电脑的硬盘上,使数据持久化。...每个被使用的文件都在内存开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量的。...每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息, 使用者不必关心细节。...一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

22620
领券