C - 基础 - 文件输入、输出

二进制 I/O fread() 、 fwrite()函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/** 将二进制数据写入文件 size_t是sizeof运算符返回类型,
ptr为要写入的数据块地址,不确定类型
size表示要写入的数据块大小(字节单位)
nmemb 数据块数目。
fp 要写入的文件
返回成写入的项目数,正常情况与nmemb相等
**/
size_t fwrite(const void * restrict ptr , size_t size , size_t nmemb , FILE * restrict fp);

// 将 256字节大小数据对象写入文件
double buffer[10];
fwrite(buffer,sizeof(double),10,fp);

/** 读取文件 size_t是sizeof运算符返回类型,
ptr 读入文件数据的内存存储地址
size表示要写入的数据块大小(字节单位)
nmemb 数据块数目。
fp 要读取的文件
返回成写入的项目数,正常情况与nmemb相等
**/
size_t fread(void * restrict ptr , size_t size , size_t nmemb , FILE * restrict fp);

// 从文件读取到缓冲区
double buffer[10];
fread(buffer,sizeof(double),10,fp);

int feof(FILE *fp) ; //读取到结尾返回非零值
int ferror(FILE *fp) ; //读写错误返回非零值

示例: 将文件追加到另一个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>

#define SLEN 50
#define BUFSIZE 1024

void appen(FILE *source, FILE *dest);

// 将文件追加到另一个文件
int main(int argc, char *argv[])
{
FILE *fp , *ft;
char source[SLEN] = "/share/PostLoanData/file.txt"; // 源文件
char targe[SLEN] = "/share/PostLoanData/file2.txt"; // 源文件

char ch;
long count, last;

if ((fp = fopen(source, "r")) == NULL)
{
printf("open source fail %s\n", source);
exit(1);
}

if ((ft = fopen(targe, "a")) == NULL)
{
printf("open targe fail %s\n", targe);
exit(2);
}
if (setvbuf(fp, NULL, _IOFBF, BUFSIZE) != 0) // 替代默认缓冲区
{
fputs("Can't create input buffer\n", stderr);
}
appen(fp, ft);
if (ferror(fp) != 0) fprintf(stderr, "Error in read file %s \n", source);
if (ferror(ft) != 0) fprintf(stderr, "Error in read file %s \n", targe);
fclose(fp);
fclose(ft);
return 0;
}

void appen(FILE * source, FILE * dest)
{
size_t bytes;
static char temp[BUFSIZE]; // 分配一次

while ((bytes = fread(temp, sizeof(char), BUFSIZE, source)) > 0) // 读取到缓冲区
fwrite(temp, sizeof(char), bytes, dest); // 从缓冲区写入文件
}

推荐文章