open、fopen、read、fread、write、fwrite、lseek、fseek函数详解

本文对比了fopen与open函数的使用场景与区别,fopen适用于标准C中的普通文件操作,具备良好的跨平台特性;而open则为Linux系统调用,主要用于设备文件的管理。此外,文中还详细介绍了如何利用fwrite与fread进行文件的数据读写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般用fopen打开普通文件,用open打开设备文件
fopen是标准c里的,而open是linux的系统调用.
他们的层次不同.
fopen可移植,open不能
#include <stdio.h>  
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);  
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);  
返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录
数小于nmemb,也可能返回0。
fwrite和fread的应用举例:
1.将一个字符串写入文件:
  1. char *str="hello,I am a test program!";  
  2. fwrite(str,sizeof(char),strlen(str),fp)  

2.将一个字符数组写入文件:
  1. char str[]={'a','b','c','d','e'};  
  2. fwrite(str,sizeof(char),sizeof(str),fp)  
3.将一个整型数组写入文件:
    int a[]={12,33,23,24,12};
    先计算数组元素个数nmemb,之后
    fwrite(a,sizeof(int),nmemb,fp)
    注:由于程序生成的文件是二进制文件而非文本文件,因此,不用机器,整数的表达不同,
        所以无法直接打开生成文件。可通过fread函数检验数据是否写入文件。
eg:fp=fopen("filename","w+") //open a filename
char buf[100];
write(fp, buf,strlen(buf)) //使用write往filename 里面写东西,这个内容是存在buf 里面的,写到fp里面
fwrite(buf, sizeof(char), sizeof(buf),fp) //使用fwrite 往filename里面写东西
read (fp, buf,strlen(buf)) //用 read来读取fp 即filename里面的内容存到buf里面
fread (buf, sizeof(char), sizeof(buf),fp) //用 fread来读取fp 即filename里面的内容存到buf里面
### C语言中 `fopen`、`fseek` 和 `fwrite` 的使用方法 #### 1. `fopen` 函数 `fopen` 是用来打开文件的一个标准库函数。它允许指定文件名以及访问模式(如只读、写入或追加)。如果文件不存在或者无法按指定模式打开,则返回 `NULL`。 以下是其基本语法: ```c FILE *fopen(const char *filename, const char *mode); ``` 其中,参数 `mode` 可以为 `"r"` 表示只读,`"w"` 表示写入(覆盖),`"a"` 表示追加等[^4]。 #### 2. `fseek` 函数 `fseek` 用于重新定位文件指针到特定位置。它的功能类似于操作系统级别的 `lseek`,但它专属于标准 I/O 流操作。该函数的定义如下: ```c int fseek(FILE *stream, long offset, int fromwhere); ``` - 参数 `offset` 定义相对于起始点偏移量; - 参数 `fromwhere` 值可以是 `SEEK_SET`(文件开头)、`SEEK_CUR`(当前位置)或 `SEEK_END`(文件结尾)[^3]。 当调用成功时返回值为零;否则返回负一并设置全局变量 `errno` 来指示错误原因[^5]。 #### 3. `fwrite` 函数 `fwrite` 负责向已打开的文件中写入数据块。其声明形式如下所示: ```c size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); ``` 这里, - `ptr` 指向要写出的数据缓冲区地址; - `size` 单个元素字节数目; - `nmemb` 数据项总数; - 返回实际完成传输的数量[^1]。 #### 综合实例演示 下面给出一段综合运用上述三个函数的小例子来展示它们的实际应用情况。 ```c #include <stdio.h> int main(void){ /* 创建新文件 */ FILE* file = fopen("data.bin","wb+"); if(!file){ perror("Failed to create/open the file"); return -1; } double numbers[] = {1.1 ,2.2 ,3.3}; size_t num_written = fwrite(numbers,sizeof(double),3,file); printf("%zu elements were written.\n",num_written ); rewind(file); // 将文件指针重置回起点 float read_val=0.f; fseek(file,(long)(sizeof(double)*1),SEEK_SET);// 移动至第二个double数处 fread(&read_val,sizeof(float),1,file); printf("Read value is %g\n",(double)read_val); fclose(file); } ``` 此程序先创建了一个名为 `data.bin` 的二进制文件,并往里面存储了一些浮点型数值数组成员。接着通过调整文件内部位置标志符再次从中检索部分记录下来的内容加以验证[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值