C语言中fread(),fwrite(),fseek()用法和功能

1.用法:

int fread(void *buffer,int size,int count,FILE *fp);

int fwrite(void *buffer,int size,int count,FILE *fp);

2.功能:

fread()──从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中; buffer是存放读入数据的起始地址(即存放何处)。

fwrite()──从buffer开始,一次输出size个字节,重复count次, 并将输出的数据存放到fp所指向的文件中。buffer是要输出数据在 内存中的起始地址(即从何处开始输出)。

一般用于二进制文件的处理。

3.fseek用法

int fseek(FILE *stream, long offset, int fromwhere);
第一个参数file指针
第二个参数移动的偏移量
第三个参数移动到哪里
分别用3个宏
SEEK_SET 既0 文件开头
SEEK_CUR 既1 文件当前位置
SEEK_END 既2 文件结尾
但不推荐用数字 最好用宏

简言之:
fseek(fp,100L,SEEK_SET);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,SEEK_CUR);把fp指针移动到离文件当前位置100字节处;
fseek(fp,100L,SEEK_END);把fp指针退回到离文件结尾100字节处。
此函数常用来计算流的长度:
int filesize = fseek( fp, 0, SEEK_END );
fseek( fp, 0, SEEK_SET );

文章来自于:
http://www.programgo.com/article/83401979833/






这里写图片描述

这里写图片描述



  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用`fread()`和`fwrite()`进行多进程移动同一个文件的内容需要注意文件指针的位置同步和文件锁的使用。下面是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> int main() { // 打开源文件和目标文件 FILE* src_file = fopen("source.txt", "rb"); FILE* dest_file = fopen("destination.txt", "wb"); // 获取源文件的大小 fseek(src_file, 0, SEEK_END); long file_size = ftell(src_file); fseek(src_file, 0, SEEK_SET); // 创建子进程 pid_t pid = fork(); if (pid == -1) { perror("fork"); exit(1); } else if (pid == 0) { // 子进程负责移动前半部分的内容 fseek(src_file, 0, SEEK_SET); fseek(dest_file, 0, SEEK_SET); size_t read_size; char buffer[1024]; while ((read_size = fread(buffer, 1, sizeof(buffer), src_file)) > 0) { // 写入目标文件 fwrite(buffer, 1, read_size, dest_file); fflush(dest_file); // 获取写入位置并同步文件指针 long current_pos = ftell(dest_file); flockfile(dest_file); fseek(src_file, current_pos, SEEK_SET); funlockfile(dest_file); } exit(0); } else { // 父进程负责移动后半部分的内容 fseek(src_file, file_size / 2, SEEK_SET); fseek(dest_file, file_size / 2, SEEK_SET); size_t read_size; char buffer[1024]; while ((read_size = fread(buffer, 1, sizeof(buffer), src_file)) > 0) { // 写入目标文件 fwrite(buffer, 1, read_size, dest_file); fflush(dest_file); // 获取写入位置并同步文件指针 long current_pos = ftell(dest_file); flockfile(dest_file); fseek(src_file, current_pos, SEEK_SET); funlockfile(dest_file); } // 等待子进程结束 wait(NULL); } // 关闭文件 fclose(src_file); fclose(dest_file); return 0; } ``` 上述代码,首先打开源文件和目标文件,并获取源文件的大小。然后使用`fork()`创建一个子进程。子进程负责移动源文件的前半部分内容,而父进程负责移动后半部分内容。子进程和父进程使用`fread()`从源文件读取数据,并使用`fwrite()`写入到目标文件。在写入之前,获取当前的写入位置并同步文件指针,确保两个进程在同一个位置进行读写操作。最后,父进程使用`wait()`等待子进程结束,然后关闭文件。 请注意,上述代码使用了文件锁(`flockfile()`和`funlockfile()`)来同步文件指针的位置,以确保多个进程在移动文件内容时不会相互干扰。同时,需要添加适当的错误处理和边界检查,以确保程序的稳定性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值