C语言全面细致讲解文件操作攻略
为了进行文件操作,C语言提供了丰富的库函数,其中包括了对文件的读写操作、文件指针的移动、文件属性的获取等操作。在本攻略中,我们将讲解C语言中的文件操作,涵盖文件的打开、读写、关闭等方面,以及常用的文件指针操作和文件属性获取。
文件的打开
在C语言中,文件的打开通常使用fopen()
函数,具体的使用方法如下:
FILE *fopen(const char *filename, const char *mode);
其中,filename
是需要打开的文件名,mode
则是打开方式。mode
的取值如下表:
模式 | 描述 |
---|---|
"r" | 打开一个已有的文本文件,读取文件 |
"w" | 打开一个文本文件,写入文件或清空文件内容 |
"a" | 打开一个文本文件,文件指针指向文件末尾,可以添加数据 |
"rb" | 打开一个已有的二进制文件,读取文件 |
"wb" | 打开一个二进制文件,写入文件或清空文件内容 |
"ab" | 打开一个二进制文件,文件指针指向文件末尾,可以添加数据 |
"r+" | 打开一个已有的文本文件,文件指针在文件开始位置 |
"w+" | 打开一个文本文件,文件指针在文件开始位置,可以读取和写入文件 |
"a+" | 打开一个文本文件,文件指针指向文件末尾,可以读取和写入文件 |
"r+b" | 打开一个已有的二进制文件,文件指针在文件开始位置 |
"w+b" | 打开一个二进制文件,文件指针在文件开始位置,可以读取和写入文件 |
"a+b" | 打开一个二进制文件,文件指针指向文件末尾,可以读取和写入文件 |
例如,下面的代码为打开或创建一个名为“test.txt”的文件,并以只写方式打开它。
FILE *fp;
fp = fopen("test.txt", "w");
if(fp == NULL) {
printf("文件打开失败\n");
}
文件的读写
打开文件之后,我们便可以对其进行读写操作,C语言提供了fread()
和fwrite()
两种函数用来读写文件。这两个函数的具体使用方式如下:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
其中,ptr
是需要写入或读出的数据的地址,size
是每个数据元素的大小,count
是请求的数据元素个数,stream
是文件指针。
例如,下面的代码为向打开的文件写入一串字符。
char str[] = "Hello World!";
fwrite(str, sizeof(char), strlen(str), fp);
下面的代码则为读取打开的文件中的一个整数。
int num;
fread(&num, sizeof(int), 1, fp);
文件的关闭
在使用完文件之后,我们需要使用fclose()
函数将其关闭,以释放使用的资源。
int fclose(FILE *stream);
例如,下面的代码为关闭之前打开的文件。
fclose(fp);
文件指针操作
在文件操作中,我们常常需要使用文件指针来控制读写的位置,C语言提供了fseek()
和ftell()
两种函数用于操作文件指针。这两个函数的具体使用方式如下:
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
其中,stream
是文件指针,offset
是偏移量,whence
指定了偏移量的起始位置,可能的值和含义如下表:
whence | 含义 |
---|---|
SEEK_SET | 文件开头 |
SEEK_CUR | 文件当前读写位置 |
SEEK_END | 文件结尾 |
例如,下面的代码为将文件指针从文件开头移动到文件尾部。
fseek(fp, 0, SEEK_END);
下面的代码则为获取当前文件指针的位置。
long pos = ftell(fp);
文件属性获取
在文件操作中,我们有时需要获取文件的一些基本属性,如文件大小、文件创建时间、文件修改时间等。对于这些操作,C语言提供了stat()
和fstat()
两个函数。这两个函数的具体使用方式如下:
int stat(const char *path, struct _stat *buffer);
int fstat(int fildes, struct _stat *buffer);
其中,path
是文件路径名,fildes
是文件描述符,buffer
是存放文件属性的结构体。
例如,下面的代码为获取文件“test.txt”的大小。
struct stat file_stat;
stat("test.txt", &file_stat);
printf("文件大小:%lld字节", file_stat.st_size);
下面的代码则为获取打开的文件的创建时间。
struct stat file_stat;
fstat(fileno(fp), &file_stat);
printf("创建时间:%s", ctime(&file_stat.st_ctime));
示例说明
下面的示例展示了如何读取一个存储了学生信息的文件。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME 20
#define MAX_LINE 100
typedef struct {
char name[MAX_NAME];
int age;
double score;
} Student;
void read_student_data(const char *filename);
int main(void)
{
const char *filename = "students.txt";
read_student_data(filename);
return 0;
}
void read_student_data(const char *filename)
{
FILE *fp;
Student stu;
char line[MAX_LINE];
fp = fopen(filename, "r");
if(fp == NULL) {
printf("文件打开失败\n");
return;
}
while(fgets(line, MAX_LINE, fp) != NULL) {
sscanf(line, "%s %d %lf", stu.name, &stu.age, &stu.score);
printf("姓名:%s,年龄:%d,分数:%g\n", stu.name, stu.age, stu.score);
}
fclose(fp);
}
下面的示例展示了如何向文件中写入一个存储了学生信息的结构体数组。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME 20
#define STUDENT_NUM 3
typedef struct {
char name[MAX_NAME];
int age;
double score;
} Student;
void write_student_data(const char *filename, Student students[], int num);
int main(void)
{
const char *filename = "students.txt";
Student students[STUDENT_NUM] = {
{"张三", 18, 89.5},
{"李四", 19, 90},
{"王五", 20, 95.5}
};
write_student_data(filename, students, STUDENT_NUM);
return 0;
}
void write_student_data(const char *filename, Student students[], int num)
{
FILE *fp;
fp = fopen(filename, "w");
if(fp == NULL) {
printf("文件打开失败\n");
return;
}
for(int i = 0; i < num; i++) {
fprintf(fp, "%s %d %g\n", students[i].name, students[i].age, students[i].score);
}
fclose(fp);
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言全面细致讲解文件操作 - Python技术站