标准C库打开创建文件
一、fopen函数
FILE *fopen(const char *filename, const char *mode);
上面是C 语言标准库函数 fopen
的函数原型。这个函数用于打开一个文件,并返回一个指向 FILE
结构的指针,该结构包含了文件的所有信息(如文件的位置、错误状态等)。如果文件打开失败,则返回 NULL
。
函数参数的解释如下:
-
const char *filename
: (包括路径,如果需要的话)。 -
const char *mode
:这是一个指向字符串的指针,该字符串定义了文件被打开的方式(或模式)。模式字符串可以是以下字符的组合:-
"r"
:以只读方式打开文件。文件必须存在。 -
"w"
:以写入方式打开文件。如果文件不存在,则创建它;如果文件存在,则其内容被清空(即文件被截断为 0 长度)。 -
"a"
:以追加模式打开文件。如果文件不存在,则创建它;如果文件存在,则写入的数据被追加到文件的末尾,而不会覆盖原有内容。 -
"r+"
:以读写方式打开文件。文件必须存在。 -
"w+"
:以读写方式打开文件。如果文件不存在,则创建它;如果文件存在,则其内容被清空。 -
"a+"
:以读写模式打开文件用于追加。如果文件不存在,则创建它;如果文件存在,则写入的数据被追加到文件的末尾,并且可以从文件的开头读取数据。
此外,还可以在模式字符串中添加字符
"b"
(在 Windows 系统上),以二进制模式打开文件,但这在 Unix 和类 Unix 系统(如 Linux 和 macOS)上通常是可选的,因为默认情况下文件就是以二进制模式打开的。 -
二、fread函数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
函数原型 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
是 C 语言标准库函数 fread
的函数原型,用于从指定的文件流中读取数据。下面是该函数各参数的详细解释:
-
void *ptr
:这是一个指向内存块的指针,fread
将从文件中读取的数据存储到这个内存块中。这个内存块应该足够大,以容纳size * nmemb
字节的数据。 -
size_t size
:指定要读取的每个数据项的大小(以字节为单位)。这通常是你希望从文件中读取的数据类型的大小。例如,如果你希望读取整数(假设为int
类型,在大多数系统上大小为 4 字节),则size
应为sizeof(int)
。 -
size_t nmemb
:指定要读取的数据项的数量。例如,如果你希望读取 10 个整数,则nmemb
应为 10。 -
FILE *stream
:这是一个指向FILE
对象的指针,该对象标识了要从中读取数据的文件流。这通常是通过fopen
函数打开文件时返回的指针。
fread
函数会尝试从 stream
指向的文件流中读取 nmemb
个数据项,每个数据项的大小为 size
字节,并将这些数据存储在 ptr
指向的内存块中。函数返回成功读取的数据项的数量,这可能会小于 nmemb
,特别是当遇到文件结束或发生错误时。
为了在使用 fread
读取字符串后确保字符串以 null 终止符('\0'
)结尾,你需要确保分配的内存块足够大以容纳额外的 null 终止符,并且在读取后手动添加它。例如,如果你知道要读取的字符串最大长度为 MAX_LENGTH
,则应该分配 MAX_LENGTH + 1
字节的内存,并在读取后添加 null 终止符。
三、fwrite函数
fwrite
是 C 语言标准库中的一个函数,用于将数据块写入文件流。这个函数的原型如你所示:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
函数的参数说明如下:
-
const void *ptr
:这是一个指向要写入数据的指针。这可以是任何类型的数据,但fwrite
会按照字节来写入。 -
size_t size
:这是每个数据项的大小(以字节为单位)。如果有一个int
数组并想写入它,那么size
应该是sizeof(int)
。 -
size_t nmemb
:这是要写入的数据项的数量。如果有一个包含 10 个int
的数组并想写入它,那么nmemb
就是 10。 -
FILE *stream
:这是一个指向FILE
对象的指针,该对象标识了要写入数据的文件流。这通常是通过fopen
函数打开文件时返回的。
fwrite
函数返回成功写入的数据项的数量。如果发生错误或到达文件末尾,则可能返回小于 nmemb
的值。
以下是一个简单的示例,说明如何使用 fwrite
函数:
#include <stdio.h>
int main() {
FILE *file = fopen("output.bin", "wb"); // 打开一个二进制文件进行写入
if (file == NULL) {
perror("Error opening file");
return 1;
}
int data[] = {1, 2, 3, 4, 5};
size_t items_written = fwrite(data, sizeof(int), sizeof(data)/sizeof(int), file);
if (items_written != sizeof(data)/sizeof(int)) {
fprintf(stderr, "Failed to write all items.\n");
}
fclose(file); // 关闭文件
return 0;
}
在这个示例中,打开了一个名为 “output.bin” 的二进制文件,并将一个整数数组写入该文件。我们使用 sizeof(int)
来确定每个数据项的大小,并使用 sizeof(data)/sizeof(int)
来确定要写入的数据项的数量。
四、例子综合说明
首先,代码包含了两个头文件:
#include <stdio.h>
#include <string.h>
-
<stdio.h>
:用于标准输入输出函数,如printf
、fopen
、fclose
等。 -
<string.h>
:用于字符串操作函数,如strlen
。
接下来是main
函数的开始:
int main()
{
然后,声明了一个文件指针fp
和一个指向字符串的指针str
,以及一个字符数组readBuf
用于存储从文件中读取的数据:
FILE *fp;
char *str = "you are sb";
char readBuf[50];
接下来,以读写模式(“w+”)打开一个名为xu.txt
的文件,并将返回的文件指针存储在fp
中:
fp = fopen("./xu.txt","w+");
如果文件打开失败(例如,由于权限问题或磁盘空间不足),fp
将被设置为NULL
。检查这一点并输出一个错误消息:
if(fp == NULL){
printf("Error opening file");
return 1;
}
然后,使用fwrite
函数将字符串str
写入文件。指定了每个数据项的大小为sizeof(char)
(即1字节),并写入了strlen(str)+1
个这样的数据项(包括字符串的结束符\0
):
fwrite(str,sizeof(char),strlen(str)+1,fp);
之后,使用fseek
函数将文件指针移回文件的开头,以便稍后读取数据:
fseek(fp,0,SEEK_SET);
size_t rd_size= fread(readBuf,sizeof(char),strlen(str),fp);
接下来,检查fread
的返回值(即读取的字符数)是否大于0,并据此决定是否打印读取到的数据或错误消息:
if(rd_size>0){
readBuf[rd_size] = '\0'; /
printf("read data:%s\n",readBuf);
}else{
printf("Failed to read data from file.\n");
}
最后,正确地使用fclose
关闭了文件并返回0表示程序正常退出:
fclose(fp);
return 0;
下面是代码
#include <stdio.h>
#include <string.h>
int main()
{
// FILE *fopen(const char *filename, const char *mode);
FILE *fp;
// 定义一个指向字符的指针str,并初始化为一个字符串字面量
char *str = "hello word!";
// 定义一个字符数组readBuf,用于存储从文件中读取的数据
char readBuf[50];
// 使用fopen函数以写加读模式("w+")打开一个名为"./xu.txt"的文件
// 如果文件不存在,则创建它;如果已存在,则清空内容
fp = fopen("./xu.txt","w+");
// 检查文件是否成功打开
if(fp == NULL){
printf("Error opening file");
// 如果文件打开失败,则返回1表示程序出错
return 1;
}
// 使用fwrite函数将字符串str写入文件
// 注意这里包括了字符串的结束符'\0'
fwrite(str,sizeof(char),strlen(str)+1,fp);
// 使用fseek函数将文件指针重置到文件的开始位置
fseek(fp,0,SEEK_SET);
// 使用fread函数尝试从文件中读取和原字符串同样长度的字符(不包括'\0')
size_t rd_size= fread(readBuf,sizeof(char),strlen(str),fp);
// 检查是否成功读取到数据
if(rd_size>0){
readBuf[rd_size] = '\0';
printf("read data:%s\n",readBuf);
}else{
printf("Failed to read data from file.\n");
}
// 关闭文件
fclose(fp);
// 程序正常结束,返回0
return 0;
}