C++笔记之C语言中常见的文件操作函数汇总
文章目录
- C++笔记之C语言中常见的文件操作函数汇总
- 1. `fopen()`: 打开文件并返回文件指针
- 2. `fclose()`: 关闭文件
- 3. `fread()`: 从文件中读取数据
- 4. `fwrite()`: 向文件写入数据
- 5. `fgetc()`: 从文件中读取一个字符
- 6. `fputc()`: 向文件写入一个字符
- 7. `fgets()`: 从文件中读取一行文本
- 8. `fputs()`: 向文件写入一行文本
- 9. `fprintf()`: 格式化写入数据到文件
- 10. `fscanf()`: 从文件中格式化读取数据
- 11. `feof()`: 检查文件结束标志
- 12. `ftell()`: 获取文件位置指针的当前位置
- 13. `fseek()`: 设置文件位置指针的位置
- 14. `rewind()`: 将文件位置指针重置到文件的开头
- 15. `remove()`: 删除文件
- 16. `rename()`: 重命名文件
- 17. `tmpfile()`: 创建临时文件
- 18. `tmpnam()`: 生成临时文件名
- 19. `feof()`: 检查文件结束标志
- 20. `fflush()`: 刷新文件缓冲区
- 21. `ferror()`: 检查文件错误标志
- 22. `perror()`: 打印错误消息
- 23. `clearerr()`: 清除文件错误和结束标志
- 24. `setvbuf()`: 设置文件缓冲区
- 25. `fileno()`: 获取文件描述符
- 26. `flockfile()`: 锁定文件以进行线程安全的访问
- 27. `funlockfile()`: 解锁文件以允许其他线程访问
- 28. `getc()`: 从标准输入流中读取一个字符
- 29. `putc()`: 将字符写入标准输出流
- 30. `getchar()`: 从标准输入流中读取一个字符
- 31. `putchar()`: 将字符写入标准输出流
- 32. `feof()`: 检查文件结束标志
- 33. `ferror()`: 检查文件错误标志
- 34. `clearerr()`: 清除文件错误和结束标志
- 35.一些易混淆的函数以及它们的详细说明
- 36.每个函数的参数列表参数数量说明
1. fopen()
: 打开文件并返回文件指针
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w"); // 以写入模式打开文件
if (file == NULL) {
perror("文件打开失败");
return 1;
}
// 使用文件指针进行写入操作
fclose(file); // 关闭文件
return 0;
}
2. fclose()
: 关闭文件
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
// 使用文件指针进行写入操作
fclose(file); // 关闭文件
return 0;
}
3. fread()
: 从文件中读取数据
#include <stdio.h>
int main() {
FILE *file = fopen("data.bin", "rb"); // 以二进制模式打开文件以供读取
if (file == NULL) {
perror("文件打开失败");
return 1;
}
char buffer[100];
size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer), file);
// 处理读取的数据
fclose(file);
return 0;
}
4. fwrite()
: 向文件写入数据
#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w"); // 以写入模式打开文件
if (file == NULL) {
perror("文件打开失败");
return 1;
}
char data[] = "Hello, World!";
size_t bytesWritten = fwrite(data, sizeof(char), sizeof(data), file);
// 处理写入的数据
fclose(file);
return 0;
}
5. fgetc()
: 从文件中读取一个字符
#include <stdio.h>
int main() {
FILE *file = fopen("input.txt", "r");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
int ch = fgetc(file);
if (ch != EOF) {
// 处理读取到的字符
}
fclose(file);
return 0;
}
6. fputc()
: 向文件写入一个字符
#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
int ch = 'A';
int result = fputc(ch, file);
if (result == ch) {
// 写入成功
}
fclose(file);
return 0;
}
7. fgets()
: 从文件中读取一行文本
#include <stdio.h>
int main() {
FILE *file = fopen("input.txt", "r");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
char buffer[100];
if (fgets(buffer, sizeof(buffer), file) != NULL) {
// 处理读取到的文本行
}
fclose(file);
return 0;
}
8. fputs()
: 向文件写入一行文本
#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
const char *text = "Hello, World!";
if (fputs(text, file) != EOF) {
// 写入成功
}
fclose(file);
return 0;
}
9. fprintf()
: 格式化写入数据到文件
#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
int number = 42;
fprintf(file, "The answer is: %d\n", number);
fclose(file);
return 0;
}
10. fscanf()
: 从文件中格式化读取数据
#include <stdio.h>
int main() {
FILE *file = fopen("input.txt", "r");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
int number;
if (fscanf(file, "%d", &number) == 1) {
// 处理读取到的整数
}
fclose(file);
return 0;
}
11. feof()
: 检查文件结束标志
#include <stdio.h>
int main() {
FILE *file = fopen("input.txt", "r");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
while (!feof(file)) {
int ch = fgetc(file);
if (ch != EOF) {
// 处理读取到的字符
}
}
fclose(file);
return 0;
}
12. ftell()
: 获取文件位置指针的当前位置
#include <stdio.h>
int main() {
FILE *file = fopen("data.bin", "rb");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
fseek(file, 0, SEEK_END); // 移动文件指针到文件末尾
long fileSize = ftell(file); // 获取当前位置
// 处理文件大小
fclose(file);
return 0;
}
13. fseek()
: 设置文件位置指针的位置
#include <stdio.h>
int main() {
FILE *file = fopen("data.bin", "rb");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
fseek(file, 50, SEEK_SET); // 移动文件指针到文件的第 50 个字节位置
// 处理文件指针的位置
fclose(file);
return 0;
}
14. rewind()
: 将文件位置指针重置到文件的开头
#include <stdio.h>
int main() {
FILE *file = fopen("data.bin", "rb");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
rewind(file); // 重置文件指针到文件开头
// 处理文件内容
fclose(file);
return 0;
}
15. remove()
: 删除文件
#include <stdio.h>
int main() {
if (remove("example.txt") == 0) {
// 文件删除成功
} else {
perror("文件删除失败");
}
return 0;
}
16. rename()
: 重命名文件
#include <stdio.h>
int main() {
if (rename("old_name.txt", "new_name.txt") == 0) {
// 文件重命名成功
} else {
perror("文件重命名失败");
}
return 0;
}
17. tmpfile()
: 创建临时文件
#include <stdio.h>
int main() {
FILE *tempFile = tmpfile(); // 创建临时文件
if (tempFile != NULL) {
// 使用临时文件进行操作
} else {
perror("创建临时文件失败");
}
return 0;
}
18. tmpnam()
: 生成临时文件名
#include <stdio.h>
int main() {
char *tempFileName = tmpnam(NULL); // 生成临时文件名
if (tempFileName != NULL) {
// 使用临时文件名
} else {
perror("生成临时文件名失败");
}
return 0;
}
19. feof()
: 检查文件结束标志
#include <stdio.h>
int main() {
FILE *file = fopen("input.txt", "r");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
while (!feof(file)) {
int ch = fgetc(file);
if (ch != EOF) {
// 处理读取到的字符
}
}
fclose(file);
return 0;
}
20. fflush()
: 刷新文件缓冲区
#include <stdio.h>
int main() {
FILE *file = fopen("output.txt", "w");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
fputs("Hello, World!", file);
fflush(file); // 刷新文件缓冲区,确保数据被写入磁盘
fclose(file);
return 0;
}
21. ferror()
: 检查文件错误标志
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
int ch = fgetc(file);
if (ch == EOF) {
if (ferror(file)) {
perror("读取文件时发生错误");
}
}
fclose(file);
return 0;
}
22. perror()
: 打印错误消息
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
// 尝试执行文件操作
fclose(file);
return 0;
}
23. clearerr()
: 清除文件错误和结束标志
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
clearerr(file); // 清除错误和结束标志
// 尝试执行文件操作
fclose(file);
return 0;
}
24. setvbuf()
: 设置文件缓冲区
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
char buffer[1024];
setvbuf(file, buffer, _IOFBF, sizeof(buffer)); // 设置文件缓冲区
// 使用文件进行写入操作
fclose(file);
return 0;
}
25. fileno()
: 获取文件描述符
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
int fd = fileno(file); // 获取文件描述符
// 使用文件描述符进行操作
fclose(file);
return 0;
}
26. flockfile()
: 锁定文件以进行线程安全的访问
#include <stdio.h>
#include <pthread.h>
void *thread_function(void *arg) {
FILE *file = (FILE *)arg;
flockfile(file); // 锁定文件
// 使用文件进行操作
funlockfile(file); // 解锁文件
return NULL;
}
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
pthread_t thread;
pthread_create(&thread, NULL, thread_function, file);
// 主线程也可以使用文件进行操作
pthread_join(thread, NULL);
fclose(file);
return 0;
}
27. funlockfile()
: 解锁文件以允许其他线程访问
#include <stdio.h>
#include <pthread.h>
void *thread_function(void *arg) {
FILE *file = (FILE *)arg;
flockfile(file); // 锁定文件
// 使用文件进行操作
funlockfile(file); // 解锁文件
return NULL;
}
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
perror("文件打开失败");
return 1;
}
pthread_t thread;
pthread_create(&thread, NULL, thread_function, file);
// 主线程也可以使用文件进行操作
pthread_join(thread, NULL);
fclose(file);
return 0;
}
28. getc()
: 从标准输入流中读取一个字符
#include <stdio.h>
int main() {
int ch = getc(stdin); // 从标准输入流读取一个字符
if (ch != EOF) {
// 处理读取到的字符
}
return 0;
}
29. putc()
: 将字符写入标准输出流
#include <stdio.h>
int main() {
int ch = 'A';
int result = putc(ch, stdout); // 将字符写入标准输出流
if (result == ch) {
// 写入成功
}
return 0;
}
30. getchar()
: 从标准输入流中读取一个字符
#include <stdio.h>
int main() {
int ch = getchar(); // 从标准输入流读取一个字符
if (ch != EOF) {
// 处理读取到的字符
}
return 0;
}
31. putchar()
: 将字符写入标准输出流
#include <stdio.h>
int main() {
int ch = 'A';
int result = putchar(ch); // 将字符写入标准输出流
if (result == ch) {
// 写入成功
}
return 0;
}
32. feof()
: 检查文件结束标志
#include <stdio.h>
int main() {
while (!feof(stdin)) {
int ch = getc(stdin);
if (ch != EOF) {
// 处理读取到的字符
}
}
return 0;
}
33. ferror()
: 检查文件错误标志
#include <stdio.h>
int main() {
int ch = getc(stdin);
if (ch == EOF) {
if (ferror(stdin)) {
perror("读取标准输入流时发生错误");
}
}
return 0;
}
34. clearerr()
: 清除文件错误和结束标志
#include <stdio.h>
int main() {
int ch = getc(stdin);
if (ch == EOF) {
clearerr(stdin); // 清除错误和结束标志
}
return 0;
}
35.一些易混淆的函数以及它们的详细说明
-
fread()
和fwrite()
: 这两个函数用于二进制文件的读取和写入。fread()
用于从文件中读取二进制数据,而fwrite()
用于将二进制数据写入文件。它们不适用于文本文件。 -
fgetc()
和fputc()
: 这两个函数用于字符级别的读取和写入。fgetc()
从文件中读取一个字符,而fputc()
将一个字符写入文件。它们适用于文本文件。 -
fgets()
和fputs()
: 这两个函数用于文本行的读取和写入。fgets()
从文件中读取一行文本,而fputs()
将一行文本写入文件。它们适用于文本文件。 -
getc()
和putc()
: 这两个函数类似于fgetc()
和fputc()
,但它们操作标准输入和标准输出流,而不是文件。getc(stdin)
从标准输入中读取一个字符,而putc(ch, stdout)
将字符写入标准输出。 -
getchar()
和putchar()
: 这两个函数也操作标准输入和标准输出流,类似于getc()
和putc()
,但它们不需要传递流参数。getchar()
从标准输入中读取一个字符,而putchar()
将字符写入标准输出。 -
feof()
和ferror()
: 这两个函数都用于检查文件操作的状态,但它们检查的是不同的条件。feof()
检查文件结束标志,如果文件已到达末尾,它返回非零值。ferror()
检查文件错误标志,如果发生了文件相关的错误,它返回非零值。通常,你会在文件操作之后使用这两个函数来检查状态。
36.每个函数的参数列表参数数量说明
#include <stdio.h>
int main() {
// fopen(): 2个参数
FILE *file = fopen("example.txt", "w"); // 文件名和文件打开模式
// fclose(): 1个参数
fclose(file); // 文件指针
// fread(): 4个参数
char buffer[100];
size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer), file); // 数据缓冲区,每个数据项的大小,数据项的数量,文件指针
// fwrite(): 4个参数
char data[] = "Hello, World!";
size_t bytesWritten = fwrite(data, sizeof(char), sizeof(data), file); // 数据缓冲区,每个数据项的大小,数据项的数量,文件指针
// fgetc(): 1个参数
int ch = fgetc(file); // 文件指针
// fputc(): 2个参数
int ch = 'A';
int result = fputc(ch, file); // 字符,文件指针
// fgets(): 3个参数
char buffer[100];
if (fgets(buffer, sizeof(buffer), file) != NULL) { // 字符串缓冲区,最大读取字符数,文件指针
// 处理读取到的文本行
}
// fputs(): 2个参数
const char *text = "Hello, World!";
if (fputs(text, file) != EOF) { // 字符串,文件指针
// 写入成功
}
// fprintf(): 2个参数
int number = 42;
fprintf(file, "The answer is: %d\n", number); // 文件指针,格式化字符串和数据
// fscanf(): 2个参数
int number;
if (fscanf(file, "%d", &number) == 1) { // 文件指针,格式化字符串和数据
// 处理读取到的整数
}
// feof(): 1个参数
while (!feof(file)) { // 文件指针
int ch = fgetc(file);
if (ch != EOF) {
// 处理读取到的字符
}
}
// ftell(): 1个参数
long currentPosition = ftell(file); // 文件指针
// fseek(): 3个参数
fseek(file, 50, SEEK_SET); // 文件指针,偏移量,起始位置
// rewind(): 1个参数
rewind(file); // 文件指针
// remove(): 1个参数
if (remove("example.txt") == 0) { // 文件名
// 文件删除成功
}
// rename(): 2个参数
if (rename("old_name.txt", "new_name.txt") == 0) { // 旧文件名,新文件名
// 文件重命名成功
}
// tmpfile(): 无参数
FILE *tempFile = tmpfile(); // 无参数
// tmpnam(): 1个参数
char *tempFileName = tmpnam(NULL); // 字符串缓冲区(可选)
// feof(): 1个参数
while (!feof(file)) { // 文件指针
int ch = fgetc(file);
if (ch != EOF) {
// 处理读取到的字符
}
}
// fflush(): 1个参数
fflush(file); // 文件指针
// ferror(): 1个参数
int ch = fgetc(file);
if (ch == EOF) {
if (ferror(file)) { // 文件指针
perror("读取文件时发生错误");
}
}
// perror(): 1个参数
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
perror("文件打开失败"); // 错误消息前缀字符串
return 1;
}
// clearerr(): 1个参数
int ch = fgetc(file);
if (ch == EOF) {
clearerr(file); // 文件指针
}
// setvbuf(): 3个参数
char buffer[1024];
setvbuf(file, buffer, _IOFBF, sizeof(buffer)); // 文件指针,缓冲区,缓冲模式
// fileno(): 1个参数
int fileDescriptor = fileno(file); // 文件指针
// flockfile(): 1个参数
flockfile(file); // 文件指针
// funlockfile(): 1个参数
funlockfile(file); // 文件指针
// getc(): 1个参数
int ch = getc(stdin); // 文件指针
// putc(): 2个参数
int ch = 'A';
int result = putc(ch, stdout); // 字符,文件指针
// getchar(): 无参数
int ch = getchar(); // 无参数
// putchar(): 1个参数
int ch = 'A';
int result = putchar(ch); // 字符
// feof(): 1个参数
while (!feof(stdin)) { // 文件指针
int ch = getc(stdin);
if (ch != EOF) {
// 处理读取到的字符
}
}
// ferror(): 1个参数
int ch = getc(stdin);
if (ch == EOF) {
if (ferror(stdin)) { // 文件指针
perror("读取标准输入流时发生错误");
}
}
// clearerr(): 1个参数
int ch = getc(stdin);
if (ch == EOF) {
clearerr(stdin); // 文件指针
}
return 0;
}