File I/O
10 methodsstdio.h 中的文件输入输出函数,用于打开、读写、关闭文件。
FILE *fopen(const char *filename, const char *mode)since C89按指定模式打开文件,返回文件指针。失败时返回 NULL。
Parameters
| Name | Type | Description |
|---|---|---|
| filename | const char * | 要打开的文件路径 |
| mode | const char * | 打开模式:r/w/a/r+/w+/a+,加 b 为二进制 |
Returns
成功返回 FILE 指针,失败返回 NULL(设置 errno)
Example
c
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
perror("fopen failed");
return 1;
}
// 读取或写入...
fclose(fp);int fclose(FILE *stream)关闭文件流,刷新缓冲区并释放资源。
Parameters
| Name | Type | Description |
|---|---|---|
| stream | FILE * | 要关闭的文件指针 |
Returns
成功返回 0,失败返回 EOF
Example
c
FILE *fp = fopen("out.txt", "w");
if (fp) {
fputs("hello", fp);
if (fclose(fp) != 0) {
perror("fclose failed");
}
}size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)从文件流读取数据块到内存,常用于二进制读取。
Parameters
| Name | Type | Description |
|---|---|---|
| ptr | void * | 存储读取 数据的缓冲区 |
| size | size_t | 每个元素的字节数 |
| nmemb | size_t | 要读取的元素个数 |
| stream | FILE * | 文件指针 |
Returns
实际读取的元素个数(可能小于 nmemb,遇到 EOF 或错误)
Example
c
FILE *fp = fopen("data.bin", "rb");
int buf[10];
size_t n = fread(buf, sizeof(int), 10, fp);
printf("读取了 %zu 个整数\n", n);
fclose(fp);size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)将内存数据块写入文件流,常用于二进制写入。
Parameters
| Name | Type | Description |
|---|---|---|
| ptr | const void * | 要写入的数据缓冲区 |
| size | size_t | 每个元素的字节数 |
| nmemb | size_t | 要写入的元素个数 |
| stream | FILE * | 文件指针 |
Returns
实际写入的元素个数(等于 nmemb 表示成功)
Example
c
int data[] = {1, 2, 3, 4, 5};
FILE *fp = fopen("data.bin", "wb");
size_t n = fwrite(data, sizeof(int), 5, fp);
printf("写入了 %zu 个整数\n", n);
fclose(fp);char *fgets(char *s, int size, FILE *stream)从文件流读取一行文本(最多 size-1 个字符)。
Parameters
| Name | Type | Description |
|---|---|---|
| s | char * | 存储读取内容的缓冲区 |
| size | int | 缓冲区大小 |
| stream | FILE * | 文件指针 |
Returns
成功返回 s,遇到 EOF 或错误返回 NULL
Example
c
FILE *fp = fopen("log.txt", "r");
char line[256];
while (fgets(line, sizeof(line), fp) != NULL) {
printf("%s", line);
}
fclose(fp);int fputs(const char *s, FILE *stream)将字符串写入文件流(不追加换行符)。
Parameters
| Name | Type | Description |
|---|---|---|
| s | const char * | 要写入的字符串 |
| stream | FILE * | 文件指针 |
Returns
成功返回非负数,失败返回 EOF
Example
c
FILE *fp = fopen("out.txt", "w");
if (fp) {
fputs("第一行\n", fp);
fputs("第二行\n", fp);
fclose(fp);
}int fprintf(FILE *stream, const char *format, ...)按格式字符串将数据写入文件流。
Parameters
| Name | Type | Description |
|---|---|---|
| stream | FILE * | 文件指针 |
| format | const char * | 格式字符串 |
| ... | 可变参数 | 要写入的数据 |
Returns
成功返回写入的字符数,失败返回负数
Example
c
FILE *fp = fopen("users.csv", "w");
const char *name = "Alice";
int age = 30;
fprintf(fp, "name,age\n%s,%d\n", name, age);
fclose(fp);int fscanf(FILE *stream, const char *format, ...)从文件流按格式字符串读取数据。
Parameters
| Name | Type | Description |
|---|---|---|
| stream | FILE * | 文件指针 |
| format | const char * | 格式字符串 |
| ... | 可变参数 | 存储读取数据的指针 |
Returns
成功匹配并赋值的项数,EOF 表示读取失败或到文件尾
Example
c
FILE *fp = fopen("data.txt", "r");
char name[50];
int age;
if (fscanf(fp, "%49s %d", name, &age) == 2) {
printf("姓名:%s 年龄:%d\n", name, age);
}
fclose(fp);int fseek(FILE *stream, long offset, int whence)since C89移动文件流的读写位置。
Parameters
| Name | Type | Description |
|---|---|---|
| stream | FILE * | 文件指针 |
| offset | long | 偏移量(字节数) |
| whence | int | 起始位置:SEEK_SET/SEEK_CUR/SEEK_END |
Returns
成功返回 0,失败返回非零值
Example
c
FILE *fp = fopen("data.bin", "rb");
// 跳到文件末尾获取大小
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
// 回到文件开头
fseek(fp, 0, SEEK_SET);
printf("文件大小:%ld 字节\n", size);
fclose(fp);int feof(FILE *stream)检测文件流是否已到达末尾。
Parameters
| Name | Type | Description |
|---|---|---|
| stream | FILE * | 文件指针 |
Returns
到达文件末尾返回非零,否则返回 0
Example
c
FILE *fp = fopen("input.txt", "r");
int ch;
while (!feof(fp)) {
ch = fgetc(fp);
if (ch == EOF) break;
putchar(ch);
}
fclose(fp);