文件指针
在C语言中,文件操作是通过文件指针来进行的。文件指针是一个指向 FILE
结构的指针,用于标识和操作一个文件。
cpp
FILE *fp;
常用的文件操作函数
fopen
:打开文件。fclose
:关闭文件。fread
:从文件中读取数据。fwrite
:向文件中写入数据。fscanf
和fprintf
:格式化读取和写入。fgets
和fputs
:读取和写入字符串。fseek
:设置文件指针的位置。ftell
:获取文件指针的位置。
打开文件 (fopen
)
fopen
函数用于打开文件,并返回一个文件指针。如果打开失败,返回 NULL
。
cpp
FILE *fopen(const char *filename, const char *mode);
常用模式:
"r"
:只读模式。"w"
:写模式,文件不存在则创建,存在则清空。"a"
:追加模式,文件不存在则创建。"r+"
:读写模式,文件必须存在。"w+"
:读写模式,文件不存在则创建,存在则清空。"a+"
:读写追加模式,文件不存在则创建。
关闭文件 (fclose
)
fclose
函数用于关闭文件,释放资源。
cpp
int fclose(FILE *fp);
读取文件
fread
fread
函数从文件中读取数据到缓冲区。
cpp
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fscanf
fscanf
函数从文件中读取格式化数据。
cpp
int fscanf(FILE *stream, const char *format, ...);
fgets
fgets
函数从文件中读取一行字符串。
cpp
char *fgets(char *str, int n, FILE *stream);
写入文件
fwrite
fwrite
函数向文件中写入数据。
cpp
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
fprintf
fprintf
函数向文件中写入格式化数据。
cpp
int fprintf(FILE *stream, const char *format, ...);
fputs
fputs
函数向文件中写入字符串。
cpp
int fputs(const char *str, FILE *stream);
文件指针操作
fseek
fseek
函数设置文件指针的位置。
cpp
int fseek(FILE *stream, long offset, int whence);
//SEEK_SET:文件开头。
//SEEK_CUR:当前位置。
//SEEK_END:文件末尾。
ftell
ftell
函数获取当前文件指针的位置。
cpp
long ftell(FILE *stream);
错误处理
文件操作过程中可能会遇到错误,常用的错误处理函数包括:
ferror
:检查文件指针是否有错误。feof
:检查文件指针是否到达文件末尾。perror
:打印错误信息。
读取文件内容并打印
cpp
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
char buffer[100];
while (fgets(buffer, 100, fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
return 0;
}
向文件写入数据
cpp
#include <stdio.h>
int main() {
FILE *fp = fopen("output.txt", "w");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
fprintf(fp, "Hello, World!\n");
fputs("This is a test.\n", fp);
fclose(fp);
return 0;
}
总结
|----------|----------------|---------------------------------------------------------------------|------------------------------------------|
| fopen
| 打开文件,并返回文件指针 | FILE *fopen(const char *filename, const char *mode);
| FILE *fp = fopen("file.txt", "r");
|
| fread
| 从文件中读取数据到缓冲区 | size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
| fread(buffer, sizeof(char), 100, fp);
|
| fscanf
| 从文件中读取格式化输入 | int fscanf(FILE *stream, const char *format, ...);
| fscanf(fp, "%d", &num);
|
| fgets
| 从文件中读取一行字符串 | char *fgets(char *str, int n, FILE *stream);
| fgets(buffer, 100, fp);
|
| fgetc
| 从文件中读取一个字符 | int fgetc(FILE *stream);
| char c = fgetc(fp);
|
| fseek
| 设置文件指针的位置 | int fseek(FILE *stream, long offset, int whence);
| fseek(fp, 0, SEEK_SET);
|
| ftell
| 获取文件指针的位置 | long ftell(FILE *stream);
| long pos = ftell(fp);
|
| fclose
| 关闭文件,释放资源 | int fclose(FILE *fp);
| fclose(fp);
|
| feof
| 检查文件指针是否到达文件末尾 | int feof(FILE *stream);
| if (feof(fp)) { /* End of file */ }
|
| ferror
| 检查文件指针是否有错误 | int ferror(FILE *stream);
| if (ferror(fp)) { /* Handle error */ }
|
| perror
| 打印错误信息 | void perror(const char *str);
| perror("Error opening file");
|
打开并读取文件
cpp
#include <stdio.h>
int main() {
FILE *fp;
char buffer[100];
int num;
// 打开文件
fp = fopen("example.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
// 使用 fgets 读取一行字符串
if (fgets(buffer, 100, fp) != NULL) {
printf("Read string: %s\n", buffer);
}
// 使用 fscanf 读取格式化输入
if (fscanf(fp, "%d", &num) == 1) {
printf("Read integer: %d\n", num);
}
// 关闭文件
fclose(fp);
return 0;
}
使用 fread
读取二进制文件
cpp
#include <stdio.h>
int main() {
FILE *fp;
char buffer[100];
size_t bytesRead;
// 打开二进制文件
fp = fopen("example.bin", "rb");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
// 使用 fread 读取数据到缓冲区
bytesRead = fread(buffer, sizeof(char), 100, fp);
printf("Bytes read: %zu\n", bytesRead);
// 关闭文件
fclose(fp);
return 0;
}
输入输出
|-----------|---------------------|-----------------|------------------------------|
| printf
| 格式化输出到标准输出(通常是屏幕) | 向控制台打印各种格式化的数据 | printf("Hello, World!\n");
|
| scanf
| 从标准输入(通常是键盘)读取格式化输入 | 从用户输入获取各种格式化的数据 | scanf("%d", &num);
|
| getchar
| 从标准输入读取单个字符 | 读取单个字符 | char c = getchar();
|
| putchar
| 向标准输出写入单个字符 | 输出单个字符 | putchar('A');
|
printf
示例
printf
用于格式化输出,可以打印整数、浮点数、字符串等。
cpp
#include <stdio.h>
int main() {
int num = 10;
float f = 3.14;
char str[] = "Hello, World!";
// 使用 printf 打印各种类型的数据
printf("Integer: %d\n", num);
printf("Float: %.2f\n", f);
printf("String: %s\n", str);
return 0;
}
scanf
示例
scanf
用于格式化输入,可以从用户输入获取整数、浮点数、字符串等。
cpp
#include <stdio.h>
int main() {
int num;
float f;
char str[50];
// 提示用户输入数据
printf("Enter an integer: ");
scanf("%d", &num);
printf("Enter a float: ");
scanf("%f", &f);
printf("Enter a string: ");
scanf("%s", str);
// 打印用户输入的数据
printf("You entered: %d, %.2f, %s\n", num, f, str);
return 0;
}
getchar
示例
getchar
用于读取单个字符,可以用于处理字符输入。
cpp
#include <stdio.h>
int main() {
char c;
// 提示用户输入一个字符
printf("Enter a character: ");
c = getchar();
// 打印用户输入的字符
printf("You entered: %c\n", c);
return 0;
}
putchar
示例
putchar
用于输出单个字符,可以用于处理字符输出。
cpp
#include <stdio.h>
int main() {
char c = 'A';
// 输出字符
printf("Character output: ");
putchar(c);
putchar('\n');
return 0;
}