一、知识点归纳
1、C语言中常用的文件操作函数
文件打开和关闭
- fopen:
FILE *fopen(const char *filename, const char *mode);
- 打开一个文件,如果成功,返回一个
FILE *
指针,否则返回NULL
. - mode 可以是:
"r"
: 只读打开"w"
: 写入打开(如果文件存在则清空内容,如果不存在则创建)"a"
: 附加打开(如果文件存在则追加内容,如果不存在则创建)"r+"
: 读/写打开"w+"
: 读/写打开,但会清空原来的内容或创建新文件"a+"
: 读/写打开,可以追加内容
- 打开一个文件,如果成功,返回一个
- fclose:
int fclose(FILE *stream);
- 关闭一个已打开的文件,成功返回
0
,失败返回EOF
.
- 关闭一个已打开的文件,成功返回
数据读取
- fread:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
- 从文件中读取数据。
- fgets:
char *fgets(char *str, int n, FILE *stream);
- 从文件中读取一行。
数据写入
- fwrite:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
- 向文件写入数据。
- fputs:
int fputs(const char *str, FILE *stream);
- 向文件写入一个字符串。
- fprintf:
int fprintf(FILE *stream, const char *format, ...);
- 格式化输出到文件。
文件定位
- fseek:
int fseek(FILE *stream, long offset, int whence);
- 设置文件位置到给定的
offset
. - whence 可以是:
SEEK_SET
: 文件开始SEEK_CUR
: 当前位置SEEK_END
: 文件结束
- 设置文件位置到给定的
- ftell:
long ftell(FILE *stream);
- 返回当前文件位置。
- rewind:
void rewind(FILE *stream);
- 将文件位置设置为文件开始。
其他
- feof:
int feof(FILE *stream);
- 检查是否达到文件结束。
- ferror:
int ferror(FILE *stream);
- 检查文件操作中是否有错误。
举例
- 源代码:
#include <stdio.h>
int main() {
FILE *file;
char content[100];
file = fopen("test.txt", "r");
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
while (fgets(content, sizeof(content), file) != NULL) {
printf("%s", content);
}
fclose(file);
return 0;
}
2、I/O库函数:
功能 | 函数名 | 适用于 |
---|---|---|
字符输入函数 | getchar | 标准输入流 |
字符输出函数 | putchar | 标准输出流 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgtes | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | scanf | 标准输入流 |
格式化输出函数 | printf | 标准输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
3、文件组织参数:
4、在计算机中,文件大致可以分为两类:
文本文件和二进制文件。
-
文本文件:它包含可读的字符(如字母、数字和标点符号)组成的文本。这些文件可以使用简单的文本编辑器(如 Notepad 或 vi)查看和编辑。文本文件的一个常见示例是
.txt
文件。 -
二进制文件:这种文件包含二进制数据,即不仅仅是常规的文本字符。它们可以包含图像、音频、可执行程序或其他数据的二进制表示。简单地使用文本编辑器打开二进制文件通常会显示一堆不可读的字符。常见的二进制文件示例包括
.jpg
、.mp3
、.exe
等。
当你在 C 语言中操作二进制文件时,需要使用特定的模式来确保文件以二进制方式正确读取或写入。这主要是为了确保在某些操作系统(如 Windows)中对文件的行结束序列进行正确处理。
以下是 C 语言操作二进制文件的示例:
以二进制模式写入文件:
#include <stdio.h>
int main() {
FILE *file;
int data[5] = {1, 2, 3, 4, 5};
file = fopen("binarydata.bin", "wb"); // 注意 "wb" 代表以二进制方式写入
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
fwrite(data, sizeof(int), 5, file); // 写入整个数组到文件
fclose(file);
return 0;
}
以二进制模式读取文件:
#include <stdio.h>
int main() {
FILE *file;
int data[5];
int i;
file = fopen("binarydata.bin", "rb"); // 注意 "rb" 代表以二进制方式读取
if (file == NULL) {
printf("无法打开文件\n");
return 1;
}
fread(data, sizeof(int), 5, file); // 从文件读取整个数组
for (i = 0; i < 5; i++) {
printf("%d ", data[i]);
}
fclose(file);
return 0;
}
当操作二进制文件时,使用 fread 和 fwrite 函数是非常普遍的,因为它们可以轻松地处理大块的二进制数据。
5、苏格拉底提问:
问题一:![I/O库知识点](/i/l/?n=23&i=blog/3275894/202309/3275894-20230917185829870-636853843.png)
![I/O库知识点](/i/l/?n=23&i=blog/3275894/202309/3275894-20230917185840575-459974821.png)
问题二:![文件操作知识点](/i/l/?n=23&i=blog/3275894/202309/3275894-20230917190316852-1779632948.png)
![文件操作知识点](/i/l/?n=23&i=blog/3275894/202309/3275894-20230917190404431-674084178.png)
二、问题解决与思路:
1、文件操作都有什么?
文件操作
在计算机编程中,文件操作主要包括以下几个方面:
- 打开文件: 使用特定的权限或模式打开文件(例如只读、读写、附加等)。
- 关闭文件: 在完成文件操作后,应始终关闭文件以释放资源。
- 读取文件: 从文件中读取数据。
- 写入文件: 向文件中写入数据。
- 删除文件: 从文件系统中删除文件。
- 重命名文件: 更改文件的名称。
- 文件定位: 改变文件的当前位置或获取当前位置,例如使用
fseek
,ftell
等。 - 文件属性查询: 如检查文件大小、修改日期等。
- 错误处理: 检查文件操作是否成功,如通过
ferror
、feof
等。
2、二进制文件和文本文件如何转换?
二进制文件和文本文件如何转换
- 从文本到二进制: 你可以读取文本文件中的数据,对其进行解析,并将其转换为所需的二进制格式,然后将二进制数据写入二进制文件。
- 从二进制到文本: 你可以从二进制文件中读取二进制数据,将其转换为可读的文本格式,并将其写入文本文件。
这种转换通常需要特定的解析逻辑,具体取决于你的数据结构和格式。
3、数据结构如何读写?
数据结构如何读写
数据结构的读写取决于特定的数据结构和你的需求。常见的方法包括:
- 序列化: 将数据结构转换为可以存储或传输的格式。序列化可以是文本格式(如JSON、XML等)或二进制格式。
- 反序列化: 从存储或传输格式中恢复数据结构。
以下是一个简单的示例,说明如何在C中使用fread
和fwrite
读写结构到二进制文件:
#include <stdio.h>
typedef struct {
int id;
char name[50];
} Person;
int main() {
FILE *file;
Person personWrite = {1, "John Doe"};
Person personRead;
// 写结构到文件
file = fopen("data.bin", "wb");
fwrite(&personWrite, sizeof(Person), 1, file);
fclose(file);
// 从文件读结构
file = fopen("data.bin", "rb");
fread(&personRead, sizeof(Person), 1, file);
fclose(file);
printf("ID: %d, Name: %s\n", personRead.id, personRead.name);
return 0;
}
三、实践过程截图、代码链接
1、实践一:
1、程序: File_rw
2、功能: 实现 1.打开指定文件并读取内容 2.在指定文件末尾追加内容
3、源代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
bool File_check(char *fname) {
FILE *fp;
fp = fopen(fname, "r+");
if (fp == NULL) {
printf("无法打开文件,按任意键退出!\n");
getchar();
return false;
}
fclose(fp); // 检查后关闭文件
return true;
}
int FileR_O(char *fname) {
char ch;
FILE *fp = fopen(fname, "r+");
if (fp == NULL) {
printf("无法打开文件进行读取,按任意键退出!\n");
getchar();
exit(1);
}
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
putchar('\n');
if (ferror(fp)) {
puts("出错了!");
fclose(fp);
return -1;
} else {
puts("\n成功!");
fclose(fp);
return 0;
}
}
int FileW_I(char *fname) {
char str[102] = {0}, strTemp[100];
FILE *fp = fopen(fname, "at+");
if (fp == NULL) {
printf("无法打开文件进行写入,按任意键退出!\n");
getchar();
exit(1);
}
printf("请输入字符串:\n");
scanf("%s", strTemp);
strcat(str, "\n");
strcat(str, strTemp);
fputs(str, fp);
fclose(fp);
return 0;
}
int main(int argc, char *argv[]) {
char Fname[50];
printf("选择操作:1.读取文件 2.写入文件\n");
scanf("%d", &choice);
printf("请输入你想操作的文件名:\n");
scanf("%s", Fname);
if (!File_check(Fname)) {
return -1;
}
if (choice == 1) {
FileR_O(Fname);
} else if (choice == 2) {
FileW_I(Fname);
printf("新的文件内容:\n\n");
FileR_O(Fname);
} else {
return -1;
}
return 0;
}
4、截图
2、实践二:
1、程序: downtoUP
2、功能: 将指定文件内小写字母转换为大写字母
3、源代码:
#include <stdlib.h>
#include <string.h>
int main ()
{
FILE *fp;
char Filename[50], ch;
int count = 0;
printf("Enter PathName:");
scanf("%s", Filename);
if((fp = fopen(Filename, "r")) == NULL)
{
printf("File open failed!\n");
exit(0);
}
while(!feof(fp))
{
ch = fgetc(fp);
if(ch != EOF)
{
if(ch >= 'a' && ch <= 'z')
{
ch -= 32;
count ++;
}
printf("%c", ch);
}
}
printf("\ntotal change : %d\n", count);
return 0;
}