一、引言
1.1、文件的概念和作用
文件是计算机中存储数据的一种方式,它是一组相关数据的集合,可以包含文本、图像、音频、视频等各种类型的数据。文件可以存在于计算机的磁盘、固态存储器、网络等各种存储介质上。
文件的作用非常广泛,主要包括以下几个方面:
- 数据存储和持久化:文件可以用来存储程序生成的数据,或保存用户输入的数据,实现数据的持久化。通过文件,数据可以被长期保存,可以在程序重启后继续使用,也可以在不同的程序之间进行共享。
- 数据交换和共享:文件可以作为数据交换的一种方式,通过将数据保存到文件中,可以方便地在不同的计算机之间进行数据交换和共享。文件可以作为数据的载体,可以从一个计算机传输到另一个计算机,实现数据的共享和传递。
- 配置和设置:文件可以用来存储程序的配置信息和用户的设置选项。通过读取和写入配置文件,程序可以根据用户的需求进行个性化设置,提高用户体验。配置文件还可以用于保存程序的默认设置,方便程序的部署和配置。
- 数据备份和恢复:文件可以用于数据备份和恢复。通过将重要的数据保存到文件中,可以防止数据丢失,当系统崩溃或数据损坏时,可以通过读取文件中的数据进行恢复。文件也可以用于定期备份数据,以防止意外情况导致的数据丢失。
- 访问和处理大量数据:文件可以用于存储和处理大量数据。通过将数据保存在文件中,可以减少程序的内存占用,提高程序的效率。文件操作还提供了对数据的随机访问和读写,可以根据需要访问和处理文件中的任意位置的数据。
1.2、C语言中的文件操作介绍
在C语言中,文件操作是通过文件指针和一组文件操作函数来实现的。以下是C语言中常用的文件操作函数的介绍:
fopen
:用于打开文件,并返回一个指向文件的指针。它接受两个参数:文件名和打开模式。打开模式可以是读取模式(“r”)、写入模式(“w”)、追加模式(“a”)等。fclose
:用于关闭文件。它接受一个文件指针作为参数,将文件指针指向的文件关闭,并释放相关的资源。fread
:用于从文件中读取数据。它接受四个参数:要读取的数据存储位置的指针、每个数据项的大小、要读取的数据项数量和文件指针。它将读取的数据存储到指定位置,并返回实际读取的数据项数量。fwrite
:用于向文件写入数据。它接受四个参数:要写入的数据存储位置的指针、每个数据项的大小、要写入的数据项数量和文件指针。它将指定位置的数据写入到文件中,并返回实际写入的数据项数量。fscanf
:用于从文件中按格式读取数据。它接受多个参数:文件指针、格式字符串和要读取的数据的地址。它根据格式字符串的指定,从文件中读取数据,并将数据存储到指定的地址中。fprintf
:用于向文件按格式写入数据。它接受多个参数:文件指针、格式字符串和要写入的数据。它根据格式字符串的指定,将数据按指定格式写入到文件中。fseek
:用于设置文件指针的位置。它接受三个参数:文件指针、偏移量和起始位置。它将文件指针移动到指定的位置,以便进行读取或写入操作。ftell
:用于获取文件指针的当前位置。它接受一个文件指针作为参数,并返回当前位置相对于文件起始位置的偏移量。
这些函数是C语言中常用的文件操作函数,通过它们可以实现对文件的打开、关闭、读取和写入等操作。在使用这些函数进行文件操作时,需要注意错误处理和异常处理,以确保文件操作的安全性和稳定性。
二、文件指针和文件操作函数
2.1、文件指针的定义和初始化
在C语言中,文件指针是一个特殊的指针类型,用于指向已经打开的文件。文件指针的定义和初始化可以通过以下方式进行:
- 定义文件指针变量:首先需要定义一个文件指针变量,它将用于存储指向文件的地址。文件指针类型在C语言中通常是
FILE*
,可以使用如下语法进行定义: FILE* fp; - 初始化文件指针变量:文件指针变量在使用之前需要进行初始化,以指向具体的文件。可以使用
fopen
函数将一个文件与文件指针关联起来,并返回一个指向该文件的指针。例如,将一个名为file.txt
的文本文件与文件指针fp
关联起来,可以使用如下语法进行初始化: fp = fopen("file.txt", "r"); 在这个例子中,文件指针fp
将指向打开的file.txt
文件,使用的打开模式是读取模式(“r”)。 - 检查文件指针的有效性:在初始化文件指针后,最好检查文件指针是否为
NULL
,以确认文件是否成功打开。如果文件打开失败,fopen
函数将返回NULL
,表示文件指针无效。例如,可以使用如下语法进行检查: if (fp == NULL) { // 文件打开失败 // 进行错误处理 }
在使用文件指针进行文件操作之前,务必要确保文件指针已经成功初始化且有效,以避免在无效的文件指针上进行操作导致的错误。
以下是一个完整的文件操作示例,包括文件指针的定义、初始化和有效性检查:
代码语言:javascript复制#include <stdio.h>
int main() {
FILE* fp;
fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
// 在这里可以进行文件读取或写入操作
fclose(fp);
return 0;
}
通过以上步骤,文件指针就可以在C语言中进行文件操作了。
2.2、文件的打开和关闭(fopen
和fclose
函数)
在C语言中,文件的打开和关闭是通过fopen
和fclose
函数来完成的。
fopen
函数用于打开文件,并返回一个指向文件的指针。它的声明如下: FILE* fopen(const char* filename, const char* mode); 其中,filename
是要打开的文件名,可以是相对路径或绝对路径;mode
是打开文件的模式,包括:- “r”:只读模式,打开文件用于读取。
- “w”:只写模式,如果文件不存在,则创建新文件;如果文件存在,则清空文件内容。
- “a”:追加写模式,如果文件不存在,则创建新文件;如果文件存在,则在文件末尾追加内容。
- “r ”:读写模式,打开文件用于读取和写入。
- “w ”:读写模式,如果文件不存在,则创建新文件;如果文件存在,则清空文件内容。
- “a ”:读写模式,如果文件不存在,则创建新文件;如果文件存在,则在文件末尾追加内容。
fopen
函数会返回一个指向文件的指针,如果打开文件失败,则返回NULL
。
fclose
函数用于关闭文件。它的声明如下: int fclose(FILE* stream); 其中,stream
是要关闭的文件指针。调用fclose
函数会关闭文件,并释放与文件相关的资源。成功关闭文件时,fclose
函数返回0;关闭失败时,返回非零值。
以下是一个简单的示例,演示如何打开和关闭文件:
代码语言:javascript复制#include <stdio.h>
int main() {
FILE* fp;
// 打开文件
fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
// 在这里可以进行文件读取操作
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
return 0;
}
在实际使用中,应始终在不再需要访问文件时及时关闭文件,以释放资源并确保数据的完整性。
2.3、文件的读取和写入(fread
、fwrite
、fscanf
、fprintf
等函数)
在C语言中,文件的读取和写入可以通过多个函数来实现,包括fread
、fwrite
、fscanf
、fprintf
等函数。下面分别介绍这些函数的使用方法:
fread
函数用于从文件中读取数据。它的声明如下: size_t fread(void* ptr, size_t size, size_t count, FILE* stream); 其中,ptr
是一个指向数据存储位置的指针;size
是每个数据项的大小;count
是要读取的数据项数量;stream
是要读取的文件指针。fread
函数会从文件中读取指定数量的数据项,存储到指定位置,并返回实际读取的数据项数量。fwrite
函数用于向文件写入数据。它的声明如下: size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream); 其中,ptr
是一个指向数据存储位置的指针;size
是每个数据项的大小;count
是要写入的数据项数量;stream
是要写入的文件指针。fwrite
函数会将指定位置的数据写入到文件中,并返回实际写入的数据项数量。fscanf
函数用于从文件中按格式读取数据。它的声明如下: int fscanf(FILE* stream, const char* format, ...); 其中,stream
是要读取的文件指针;format
是格式字符串,用于指定要读取的数据的格式;...
是要读取的数据的地址。fscanf
函数会根据格式字符串的指定,从文件中读取数据,并将数据存储到指定的地址中。它返回成功匹配和读取的数据项数量。fprintf
函数用于向文件按格式写入数据。它的声明如下: int fprintf(FILE* stream, const char* format, ...); 其中,stream
是要写入的文件指针;format
是格式字符串,用于指定要写入的数据的格式;...
是要写入的数据。fprintf
函数会根据格式字符串的指定,将数据按指定格式写入到文件中。它返回成功写入的字符数量。
2.4、文件指针的定位和移动(fseek
和ftell
函数)
在C语言中,可以使用fseek
和ftell
函数来进行文件指针的定位和移动。
fseek
函数用于将文件指针定位到指定位置。它的声明如下: int fseek(FILE* stream, long int offset, int origin); 其中,stream
是要定位的文件指针;offset
是相对于origin
的偏移量;origin
是定位的起始位置,可以是以下值之一:SEEK_SET
:从文件开头开始计算偏移量。SEEK_CUR
:从当前位置开始计算偏移量。SEEK_END
:从文件末尾开始计算偏移量。fseek
函数将文件指针定位到指定位置,并返回0表示定位成功,返回非零值表示定位失败。
ftell
函数用于获取文件指针当前的位置。它的声明如下: long int ftell(FILE* stream); 其中,stream
是要获取位置的文件指针。ftell
函数返回当前文件指针的位置,以字节为单位。如果获取位置失败,ftell
函数会返回-1。
以下是一个示例,演示了如何使用fseek
和ftell
函数来定位和移动文件指针:
#include <stdio.h>
int main() {
FILE* fp;
long int pos;
// 打开文件
fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
// 将文件指针定位到文件末尾
fseek(fp, 0, SEEK_END);
// 获取文件指针的位置
pos = ftell(fp);
if (pos == -1) {
printf("获取文件指针位置失败n");
return 1;
}
printf("文件大小为%ld字节n", pos);
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
return 0;
}
在上述示例中,首先打开了一个文件,并使用fseek
函数将文件指针定位到文件末尾。然后使用ftell
函数获取文件指针的位置,即文件的大小。最后关闭文件。通过这种方式,可以定位和移动文件指针,并获取文件的大小等信息。
三、文本文件操作
3.1、文本文件的读取(逐行读取、逐字符读取)
在C语言中,可以使用fgets
函数逐行读取文本文件,使用getc
函数逐字符读取文本文件。
fgets
函数用于逐行读取文本文件。它的声明如下: char* fgets(char* str, int n, FILE* stream); 其中,str
是一个指向字符数组的指针,用于存储读取的字符串;n
是要读取的最大字符数(包括结尾的空字符);stream
是要读取的文件指针。fgets
函数会从文件中读取一行字符(包括换行符n
),存储到指定的字符数组中,并在结尾添加一个空字符。它返回读取的字符串的指针,如果读取失败或到达文件结尾,则返回NULL
。getc
函数用于逐字符读取文本文件。它的声明如下: int getc(FILE* stream); 其中,stream
是要读取的文件指针。getc
函数会从文件中读取一个字符,并返回读取的字符的ASCII码值(0-255)。如果到达文件结尾或读取失败,它会返回EOF
(End of File)。
以下是一个示例,演示了如何使用fgets
函数逐行读取文本文件和使用getc
函数逐字符读取文本文件:
#include <stdio.h>
int main() {
FILE* fp;
char line[100];
int ch;
// 逐行读取文本文件
fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
while (fgets(line, sizeof(line), fp) != NULL) {
printf("%s", line);
}
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
// 逐字符读取文本文件
fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
while ((ch = getc(fp)) != EOF) {
putchar(ch);
}
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
return 0;
}
3.2、文本文件的写入(逐行写入、逐字符写入)
在C语言中,可以使用fputs
函数逐行写入文本文件,使用putc
函数逐字符写入文本文件。
fputs
函数用于逐行写入文本文件。它的声明如下: int fputs(const char* str, FILE* stream); 其中,str
是要写入的字符串;stream
是要写入的文件指针。fputs
函数会将指定的字符串写入到文件中,直到遇到结尾的空字符。它返回非负值表示成功,返回EOF
表示失败。putc
函数用于逐字符写入文本文件。它的声明如下: int putc(int ch, FILE* stream); 其中,ch
是要写入的字符的ASCII码值(0-255);stream
是要写入的文件指针。putc
函数会将指定的字符写入到文件中。它返回写入的字符的ASCII码值(0-255),如果写入失败,返回EOF
。
以下是一个示例,演示了如何使用fputs
函数逐行写入文本文件和使用putc
函数逐字符写入文本文件:
#include <stdio.h>
int main() {
FILE* fp;
char line[] = "This is a line.";
char ch = 'A';
// 逐行写入文本文件
fp = fopen("file.txt", "w");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
fputs(line, fp);
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
// 逐字符写入文本文件
fp = fopen("file.txt", "w");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
putc('H', fp);
putc('e', fp);
putc('l', fp);
putc('l', fp);
putc('o', fp);
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
return 0;
}
在上述示例中,首先使用fputs
函数逐行写入文本文件。然后使用putc
函数逐字符写入文本文件。通过这种方式,可以逐行或逐字符将数据写入到文本文件中。
3.3、文本文件的格式化读写(格式化输入输出函数)
在C语言中,可以使用格式化输入输出函数来进行文本文件的格式化读写。常用的格式化输入函数有fscanf
和fgets
,常用的格式化输出函数有fprintf
和fputs
。
fscanf
函数用于从文本文件中进行格式化读取。它的声明如下: int fscanf(FILE* stream, const char* format, ...); 其中,stream
是要读取的文件指针;format
是格式化输入字符串,指定了读取数据的格式;...
表示可变参数,用于接收读取的数据。fscanf
函数会根据指定的格式从文件中读取数据,并将读取的数据存储到相应的变量中。它返回成功读取的数据个数。fprintf
函数用于向文本文件中进行格式化写入。它的声明如下: int fprintf(FILE* stream, const char* format, ...); 其中,stream
是要写入的文件指针;format
是格式化输出字符串,指定了要写入的数据的格式;...
表示可变参数,用于传递要写入的数据。fprintf
函数会根据指定的格式将数据写入到文件中。它返回成功写入的字符数。
以下是一个示例,演示了如何使用fscanf
和fprintf
进行文本文件的格式化读写:
#include <stdio.h>
int main() {
FILE* fp;
int num;
char str[100];
// 格式化读取文本文件
fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
fscanf(fp, "%d", &num);
fscanf(fp, "%s", str);
printf("读取到的整数:%dn", num);
printf("读取到的字符串:%sn", str);
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
// 格式化写入文本文件
fp = fopen("file.txt", "w");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
fprintf(fp, "%dn", 123);
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
return 0;
}
四、二进制文件操作
4.1、二进制文件的读取(按字节读取、按数据类型读取)
在C语言中,可以使用fread
函数按字节读取二进制文件,使用fread
函数按数据类型读取二进制文件。
fread
函数用于按字节读取二进制文件。它的声明如下: size_t fread(void* ptr, size_t size, size_t count, FILE* stream); 其中,ptr
是要读取数据存储的内存地址;size
是每个数据项的字节数;count
是要读取的数据项的个数;stream
是要读取的文件指针。fread
函数会从文件中读取指定个数的数据项到指定的内存地址中。它返回实际成功读取的数据项个数。fread
函数也可以按数据类型读取二进制文件,只需根据数据类型的字节数设置size
参数,读取的数据项个数设置为1即可。例如,读取一个int
类型的数据可以使用以下代码: int num; fread(&num, sizeof(int), 1, fp);
以下是一个示例,演示了如何按字节和按数据类型读取二进制文件:
代码语言:javascript复制#include <stdio.h>
int main() {
FILE* fp;
unsigned char buffer[100];
int num;
// 按字节读取二进制文件
fp = fopen("file.bin", "rb");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
fread(buffer, sizeof(unsigned char), 100, fp);
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
// 按数据类型读取二进制文件
fp = fopen("file.bin", "rb");
if (fp == NULL) {
printf("文件打开失败n");
return 1;
}
fread(&num, sizeof(int), 1, fp);
// 关闭文件
if (fclose(fp) != 0) {
printf("文件关闭失败n");
return 1;
}
return 0;
}
在上述示例中,首先使用fread
函数按字节读取二进制文件,将读取的数据存储到指定的内存地址中。然后使用fread
函数按数据类型读取二进制文件,将读取的数据存储到相应的变量中。通过这种方式,可以按需求从二进制文件中读取数据。
4.2、二进制文件的写入(按字节写入、按数据类型写入)
在C语言中,可以使用fwrite
函数按字节写入二进制文件,使用fwrite
函数按数据类型写入二进制文件。
fwrite
函数用于按字节写入二进制文件。它的声明如下: size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream); 其中,ptr
是要写入的数据的内存地址;size
是每个数据项的字节数;count
是要写入的数据项的个数;stream
是要写入的文件指针。fwrite
函数会将指定个数的数据项从指定的内存地址写入文件中。它返回实际成功写入的数据项个数。fwrite
函数也可以按数据类型写入二进制文件,只需根据数据类型的字节数设置size
参数,写入的数据项个数设置为1即可。例如,写入一个int
类型的数据可以使用以下代码: int num = 123; fwrite(&num, sizeof(int), 1, fp);
五、文件错误处理和异常
5.1、文件操作函数的返回值和错误码
C语言文件操作函数(如fopen
、fclose
、fread
、fwrite
等)的返回值和错误码可以通过检查errno
变量来获取。
- 返回值:
fopen
函数返回一个文件指针,它指向已打开的文件。如果文件打开失败,返回值为NULL
。fclose
函数返回一个整数值,表示文件关闭的结果。如果文件关闭成功,返回值为0
;如果文件关闭失败,返回值为EOF
。fread
和fwrite
函数返回一个size_t
类型的值,表示实际读取或写入的数据项个数。如果读取或写入的数据项个数与指定的个数不一致,可能表示发生了错误。
- 错误码:
- C标准库定义了一组宏来表示不同的错误码。这些宏定义在
errno.h
头文件中。 - 当文件操作函数发生错误时,应用程序可以通过
errno
变量来获取相应的错误码。errno
是一个全局变量,类型为int
。 - 如果文件操作函数返回
NULL
或EOF
,并且同时设置了errno
变量,那么errno
的值将指示出具体的错误类型。
- C标准库定义了一组宏来表示不同的错误码。这些宏定义在
常见的errno
错误码包括:
EACCES
:权限不足ENOENT
:文件不存在EEXIST
:文件已存在ENOMEM
:内存不足EBADF
:无效的文件描述符EIO
:IO错误EINVAL
:无效的参数EPIPE
:管道破裂
要获取具体的错误信息,可以使用strerror
函数,它接受一个错误码作为参数,并返回一个字符串表示错误信息。例如:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main() {
FILE* fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("文件打开失败:%sn", strerror(errno));
return 1;
}
// 文件操作
if (fclose(fp) != 0) {
printf("文件关闭失败:%sn", strerror(errno));
return 1;
}
return 0;
}
在上述示例中,当文件打开或关闭失败时,使用strerror(errno)
来获取具体的错误信息,并打印出来。
5.2、文件操作的异常处理(使用perror
函数和错误码)
C语言文件操作的异常处理可以使用perror
函数和错误码来实现。
perror
函数用于将错误信息打印到标准错误流(stderr)中。它接受一个字符串作为参数,用于描述错误的来源,然后会根据当前的errno
值来打印相应的错误信息。
以下是一个示例,演示了如何使用perror
函数和错误码进行C语言文件操作的异常处理:
#include <stdio.h>
#include <errno.h>
int main() {
FILE* fp = fopen("file.txt", "r");
if (fp == NULL) {
perror("文件打开失败");
return 1;
}
// 文件操作
if (fclose(fp) != 0) {
perror("文件关闭失败");
return 1;
}
return 0;
}
在上述示例中,当文件打开或关闭失败时,使用perror
函数将错误信息打印到标准错误流中,并携带自定义的错误来源描述。perror
函数会根据当前的errno
值来获取相应的错误信息,并将其与自定义的错误来源描述一起打印出来。
六、文件的复制和移动
6.1、文件的复制(从一个文件复制到另一个文件)
在C语言中,可以使用文件操作函数来实现从一个文件复制到另一个文件的功能。以下是一个示例:
代码语言:javascript复制#include <stdio.h>
#define BUFFER_SIZE 4096
int main() {
FILE* sourceFile;
FILE* destinationFile;
char buffer[BUFFER_SIZE];
size_t bytesRead;
// 打开源文件
sourceFile = fopen("source.txt", "rb");
if (sourceFile == NULL) {
printf("无法打开源文件n");
return 1;
}
// 创建目标文件
destinationFile = fopen("destination.txt", "wb");
if (destinationFile == NULL) {
printf("无法创建目标文件n");
fclose(sourceFile);
return 1;
}
// 逐块读取源文件并写入目标文件
while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, sourceFile)) > 0) {
fwrite(buffer, 1, bytesRead, destinationFile);
}
// 关闭文件
fclose(sourceFile);
fclose(destinationFile);
printf("文件复制完成n");
return 0;
}
在上述示例中,首先打开源文件(source.txt
)进行读取,然后创建目标文件(destination.txt
)进行写入。通过循环读取源文件的内容,并将读取到的内容写入目标文件,直到源文件的内
6.2、文件的移动(更改文件名或移动文件位置)
在C语言中,可以使用rename
函数来更改文件名或移动文件位置。
rename
函数的原型如下:
int rename(const char *oldpath, const char *newpath);
其中,oldpath
是指向旧文件名或旧文件路径的字符串,newpath
是指向新文件名或新文件路径的字符串。
以下是一个示例,演示如何使用rename
函数来更改文件名或移动文件位置:
#include <stdio.h>
int main() {
const char* oldPath = "oldfile.txt";
const char* newPath = "newfile.txt";
if (rename(oldPath, newPath) != 0) {
printf("文件移动失败n");
return 1;
}
printf("文件移动成功n");
return 0;
}
在上述示例中,首先定义了旧文件路径oldPath
和新文件路径newPath
,然后使用rename
函数将旧文件移动到新的位置或更改文件名。如果rename
函数返回值不为0,则表示文件移动失败,否则表示文件移动成功。
七、文件操作的实例
7.1、读取和解析配置文件
在C语言中,可以使用文件操作函数来读取和解析配置文件。以下是一个示例:
假设我们有一个名为config.txt
的配置文件,其内容如下:
# 这是一个配置文件示例
username=John
password=123456
port=8080
现在,我们可以使用以下代码来读取和解析该配置文件:
代码语言:javascript复制#include <stdio.h>
#include <string.h>
#define MAX_LINE_LENGTH 100
#define MAX_KEY_LENGTH 50
#define MAX_VALUE_LENGTH 50
int main() {
FILE* configFile;
char line[MAX_LINE_LENGTH];
char key[MAX_KEY_LENGTH];
char value[MAX_VALUE_LENGTH];
char* delimiter;
int lineNumber = 0;
// 打开配置文件
configFile = fopen("config.txt", "r");
if (configFile == NULL) {
printf("无法打开配置文件n");
return 1;
}
// 逐行读取配置文件内容
while (fgets(line, MAX_LINE_LENGTH, configFile) != NULL) {
lineNumber ;
// 忽略注释行和空行
if (line[0] == '#' || line[0] == 'n') {
continue;
}
// 查找键值分隔符
delimiter = strchr(line, '=');
if (delimiter == NULL) {
printf("配置文件格式错误,第%d行n", lineNumber);
fclose(configFile);
return 1;
}
// 解析键和值
strncpy(key, line, delimiter - line);
key[delimiter - line] = '