文件操作需要经过以下几个步骤:
-
文件打开:C语言中,使用
fopen
函数来打开文件。该函数接受两个参数:文件路径和打开模式(如"r"表示只读,"w"表示写入,"a"表示追加等)。如果文件打开成功,fopen
返回一个非空的文件指针;否则返回NULL。 -
文件读写:C语言提供了多种函数用于文件的读写操作,如
fgetc
、fgets
用于从文件中读取字符或字符串,fputc
、fputs
用于向文件中写入字符或字符串。此外,还有fread
和fwrite
函数用于读写二进制数据。 -
文件定位:C语言中的
fseek
函数用于移动文件位置指针到指定位置,从而实现对文件的定位。通过定位,程序可以从文件的任意位置开始读写数据。 -
文件关闭:使用完文件后,应该使用
fclose
函数关闭文件。关闭文件可以释放系统资源,确保数据的完整性。
1 文件打开
fopen
是C语言标准库中的一个函数,用于打开文件,并返回一个指向该文件的指针,这个指针被称为文件指针。语法格式:
FILE *fopen(const char *filename, const char *mode);
功能:打开一个已经存在的文件,并返回这个文件的文件指针(文件的标识)或者创建一个文件,并打开此文件,然后返回文件的标识。
参数:
filename:要打开的文件名(可以包含路径)。
mode:打开文件的方式,也就是文件访问模式。
返回值:
成功时,返回一个非空的FILE指针
失败时,返回NULL
其中,mode参数指定了文件应如何打开,它可以是以下值之一或它们的组合:
"r":以只读方式打开文件。文件必须存在。
"w":以写入方式打开文件。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件。
"a":以追加方式打开文件。如果文件存在,写入的数据会被加到文件尾;如果文件不存在,则创建新文件。
"r+":以读写方式打开文件。文件必须存在。
"w+":以读写方式打开文件。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件。
"a+":以读写方式打开文件。如果文件存在,写入的数据会被加到文件尾;如果文件不存在,则创建新文件。
此外,为了支持二进制文件的打开,还可以在上述模式字符串中添加一个b字符,例如"rb"表示以二进制方式只读打开文件
2 文件关闭
fclose
是用于关闭一个先前由fopen
或类似函数打开的文件。语法格式:
int fclose(FILE *fp);
功能:关闭fp所代表的文件
参数:
fp:这是一个指向FILE类型结构的指针,指向要关闭的目标文件。这个指针通常是由fopen函数返回的。
返回值:
如果文件成功关闭,fclose函数返回0。
如果关闭文件失败,fclose函数返回EOF(通常是-1)。如果传递给fclose的指针是NULL,并且程序可以继续执行,fclose将设定错误码为EINVAL,并返回EOF
代码示例:
#include <stdio.h>
int main()
{
// 打开文件
FILE *fp = fopen("example.txt", "r");
if (fp == NULL)
{
printf("打开文件失败");
return 1;
}
// 关闭文件
if (fclose(fp) != 0)
{
printf("关闭文件失败\n");
return 1;
}
else
{
printf("关闭文件成功\n");
}
return 0;
}
注意,使用fclose
时,应当总是检查其返回值以确保文件已经正确关闭。未正确关闭文件可能导致数据丢失或资源泄漏。在调用fclose
之前,通常建议先清空文件缓冲区,以确保所有数据都被写入文件。
3 文件读取
3.1 读取一个字符
fgetc
是 C 语言标准库中的一个函数,用于从指定的文件流中读取一个字符。语法格式:
int fgetc(FILE *stream);
功能:从指定的文件流中读取一个字符。
参数:
FILE *stream:这是一个指向 FILE 对象的指针,它表示要从中读取字符的文件流。
返回值:
如果读取成功,fgetc 返回读取到的字符。
如果在读取字符时遇到文件结尾(EOF),或者发生错误,fgetc 将返回 EOF。
在使用 fgetc
时,通常需要检查返回值是否为 EOF,以确定是否已到达文件末尾或发生了错误。可以使用 feof(stream)
函数来检查是否到达文件末尾,使用 ferror(stream)
函数来检查是否发生错误。
代码示例:
#include <stdio.h>
int main()
{
// 打开文件
FILE *file = fopen("example.txt", "r");
if (file == NULL)
{
printf("文件打开失败\n");
return 1;
}
int character;
// 循环读取文件中字符,直到文件结尾
while ((character = fgetc(file)) != EOF)
{
// 检查是否为 EOF 之外的错误
if (ferror(file))
{
printf("文件读取出错\n");
break;
}
// 否则,输出读取到的字符
putchar(character);
}
if (feof(file))
{
printf("\n文件读取结束!\n");
}
fclose(file);
return 0;
}
3.2 读取一个字符串
fgets
是 C 语言中的一个标准库函数,用于从指定的文件流中读取一行数据,直到遇到换行符('\n')、文件结束符(EOF)或读取了指定数量的字符为止(不包括末尾的换行符)。语法格式:
char *fgets(char *str, int n, FILE *stream);
功能:从指定的文件流中读取一行数据,直到遇到换行符('\n')、文件结束符(EOF)或读取了指定数量的字符为止(不包括末尾的换行符)。
参数:
str:这是一个指向字符数组的指针,用于存储从文件中读取的字符串。这个数组必须足够大,以容纳要读取的字符串,包括一个额外的空字符('\0')作为字符串的结束标志。
n:这是一个整数,指定了最多读取的字符数(包括结尾的空字符)。通常,这个值会设置为字符数组的大小。
stream:这是一个指向 FILE 对象的指针,它表示要从中读取字符串的文件流。这个 FILE 对象通常是通过 fopen 函数打开的。
返回值:
如果成功读取一行,fgets 返回指向 str 的指针。
如果在读取任何字符之前就遇到文件结束符或发生错误,fgets 返回 NULL。
代码示例:
#include <stdio.h>
int main()
{
// 打开文件
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
perror("文件打开失败\n");
return 1;
}
char line[100] = {0};
// 循环读取每一行数据
while (fgets(line, sizeof(line), file))
{
// 处理读取到的行数据
printf("%s", line);
}
// 判断是否读取至文件尾部
if (feof(file))
{
printf("\n文件读取结束!\n");
}
else if (ferror(file))
{
perror("文件读取错误\n");
}
fclose(file);
return 0;
}
注意,
-
fgets
会将读取的字符串(包括末尾的空字符)存储在str
指向的数组中。如果读取的字符串中包含换行符,它也会被存储在数组中。 -
fgets
会在读取到换行符、EOF 或读取了n-1
个字符后停止(留一个位置给空字符)。这意味着如果一行中的字符数超过了n-1
,fgets
只会读取部分行。 -
如果需要连续读取多行数据,并且每行数据的长度可能超过
n-1
,你需要在一个循环中多次调用fgets
,每次处理完一行数据后再读取下一行。
3.3 读取指定大小数据
fread
是C语言标准库中的一个函数,用于从文件中读取数据。它可以将指定数量的数据项从文件中读取到内存中。语法格式:
size_t fread(void *ptr, size_t size, size_t count, FILE *fp);
功能:从fp所标识的文件中读取数据,每块是size个字节,共count块,存放到ptr指向的内存里。
参数:
ptr:指向要读取数据的缓冲区的指针,即数据保存的地址。
size:每个数据项的字节数。
count:要读取的数据项数目。
fp:指向文件流的指针,即要读取的文件的标识符。
返回值:
fread函数返回成功读取的数据项个数。如果发生错误或在读取任何数据项之前就已经到达文件末尾,返回值可能小于count
代码示例:
#include <stdio.h>
int main()
{
// 打开文件
FILE *fp = fopen("example.txt", "r");
if (fp == NULL)
{
printf("文件打开失败\n");
return 1;
}
char buffer[100]; // 读取数据的缓冲区
// 读取数据
size_t itemsRead = fread(buffer, sizeof(char), sizeof(buffer), fp);
if (itemsRead == 0)
{
// 判断是否读到文件结尾
if (feof(fp))
{
printf("已经读到文件尾部\n");
}
else
{
printf("文件读取出错\n");
}
fclose(fp);
return 1;
}
fclose(fp); // 关闭文件
return 0;
}
注意,
-
fread
函数主要用于读取二进制文件,但也可以用于读取文本文件。在读取文本文件时,需要确保正确处理换行符等文本特定的字符。 -
使用
fread
时,应当检查返回值以确保正确读取了期望数量的数据项。如果返回值小于count
,可能表示文件末尾已经到达,或者发生了其他错误。
4 文件写入
fwrite
是C语言标准库中的一个文件操作函数,主要用于将数据写入到文件中。其详细定义如下:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *fp);
功能:将ptr指向的内存里的数据,向fp所标识的文件中写入数据,每块是size个字节,共count块。
参数:
ptr:这是一个指向要写入文件的数据的指针。
size:每个数据元素的大小(以字节为单位)。
count:要写入的数据元素的数量。
fp:这是一个指向FILE结构的指针,即目标文件的标识符。
返回值:
fwrite函数返回成功写入文件的数据项个数。如果发生错误或在写入任何数据项之前就已经到达文件末尾,返回值可能小于count。
代码示例:
#include <stdio.h>
int main()
{
FILE *fp;
int data[] = {1, 2, 3, 4, 5};
size_t elements = sizeof(data) / sizeof(data[0]);
// 打开文件以进行二进制写入
fp = fopen("example.txt", "w+");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
// 将整数数组写入文件
size_t itemsWritten = fwrite(data, sizeof(int), elements, fp);
if (itemsWritten != elements)
{
printf("文件写入失败\n");
fclose(fp);
return 1;
}
// 关闭文件
fclose(fp);
return 0;
}
5 文件定位
fseek
是C语言标准库中的一个函数,用于设置文件指针的位置。语法格式:
int fseek(FILE *stream, long offset, int whence);
功能:移动文件流的读写位置
参数:
stream:这是一个指向要操作的文件的指针,通常是由fopen函数返回的。
offset:偏移量,表示以字节为单位的偏移量。正数表示向后移动,负数表示向前移动。
whence:起始点,指定从哪个位置开始计算偏移量。它可以是以下三个常量之一:
SEEK_SET:文件开头。偏移量是从文件起始位置开始计算的。
SEEK_CUR:文件当前位置。偏移量是从文件当前位置开始计算的。
SEEK_END:文件末尾。偏移量是从文件末尾开始计算的。
返回值:
0 执行成功
非0 执行失败
代码示例:
#include <stdio.h>
int main()
{
// 打开文件
FILE *file = fopen("example.txt", "r");
if (file == NULL)
{
printf("文件打开失败\n");
return 1;
}
// 假设我们要将文件指针移动到距离文件开始处10个字节的位置
long offset = 10;
if (fseek(file, offset, SEEK_SET) != 0)
{
printf("文件定位失败\n");
fclose(file);
return 1;
}
// 从当前位置开始读取内容
char buffer[100] = {0};
if (fgets(buffer, sizeof(buffer), file) != NULL)
{
printf("文件偏移及后续内容分别是%ld:\n%s", offset, buffer);
}
else
{
printf("没有读取到当前位置后续内容.\n");
}
// 关闭文件
fclose(file);
return 0;
}
注意,在调用fseek
之前,必须确保已经使用fopen
打开了文件,并且传入了正确的文件指针。此外,fseek
仅改变文件指针的位置,并不实际读取或写入任何数据。
6 文件重头定位
rewind
是C语言标准库中的一个函数,用于将文件内部的位置指针重新指向一个流(数据流/文件)的开头置。语法格式:
void rewind(FILE *stream)
功能:用于将文件内部的位置指针重新指向一个流(数据流/文件)的开头。
参数:
stream:这是一个指向要操作的文件的指针,通常是由fopen函数返回的。
返回值:
无
代码示例:
#include <stdio.h>
int main()
{
// 打开文件
FILE *file = fopen("example.txt", "r");
if (file == NULL)
{
printf("文件打开失败\n");
return 1;
}
// 第一次读取文件内容
printf("第一次读:\n");
char buffer[100] = {0};
while (fgets(buffer, sizeof(buffer), file))
{
printf("%s", buffer);
}
// 使用rewind将文件指针重置到文件开头
rewind(file);
// 第二次读取文件内容
printf("\n第二次读:\n");
while (fgets(buffer, sizeof(buffer), file))
{
printf("%s", buffer);
}
// 关闭文件
fclose(file);
return 0;
}
7 获取文件当前读写位置
ftell
函数是C语言中的一个标准库函数,它的主要功能是返回当前文件指针的位置,即文件位置指针当前位置相对于文件首的偏移字节数。语法格式:
long ftell(FILE *stream)
功能:返回当前文件指针的位置
参数:
stream:这是一个指向要操作的文件的指针,通常是由fopen函数返回的。
返回值:
返回当前读写位置(距离文件起始的字节数),出错时返回-1。
代码示例:
#include <stdio.h>
int main()
{
// 打开文件
FILE *file = fopen("example.txt", "r");
if (file == NULL)
{
printf("文件打开失败\n");
return 1;
}
// 读取一些内容
char buffer[100] = {0};
if (fgets(buffer, sizeof(buffer), file))
{
printf("读取一行,内容: %s", buffer);
}
else
{
printf("文件读取错误\n");
fclose(file);
return 1;
}
// 使用ftell获取当前文件指针的位置
long pos = ftell(file);
printf("文件当前位置值: %ld bytes\n", pos);
// 关闭文件
fclose(file);
return 0;
}