C语言文件读写操作
标准I/O库函数:fopen()、fwrite()、fread()、fclose()函数详解:
fopen()、fwrite()、fread()、fclose()函数都属于标准I/O库函数,调用这些函数需要包含头文件#include<stdio.h>,这些函数都是构建于文件I/O系统调用之上的,如:open()、write()、lseek()
fopen()函数:打开文件:
- 函数原型:FILE* fopen(const char* path, const char* mode);
- 函数参数:path:文件路径(绝对路径/相对路径);mode:文件的读写权限,是一个字符串;
- 返回值:调用成功返回一个FILE类型的对象指针,该指针与打开或创建的文件相关联;如果调用失败则返回NULL,并设置errno以指示错误原因。
常用参数mode的取值范围:
mode | 说明 |
r | 以只读的方式打开文件 |
r+ | 以可读、可写的方式打开文件 |
w | 以只写的方式打开文件,如果path指定的文件存在,则将文件长度截断为0; 如果path指定的文件不存在,则创建该文件 |
w+ | 以可读写的方式打开文件,如果path指定的文件存在,则将文件长度截断为0; 如果path指定的文件不存在,则创建该文件 |
a | 以只写的方式打开文件,打开后已进行追加内容(在文件末尾写入),如果文件不存在则创建该文件 |
a+ | 以可读写的方式打开文件,以追加的方式写入(在文件末尾),如果文件不存在则创建该文件 |
b | 以二进制的方式打开文件 |
fwrite()函数:写入文件:
- 函数原型:size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);
- 函数参数:ptr:待写入数据的缓冲区;size:每个数据项的字节大小,与fread()函数的size参数意义相同;nmemb:写入的数据项个数,与fread()函数的nmemb参数意义相同;stream:打开的文件指针(FILE*类型)。
- 返回值:成功时,返回写入的数据项的数目(数据项的数目不等于实际写入的字节数,除非参数size等于1);错误时,返回值小于参数nmemb(或等于0)。
fread()函数:读取文件:
- 函数原型:size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream);
- 函数参数:ptr:存放读取数据的缓冲区;size:每个数据项的字节大小;nmemb:参数nmemb指定了读取数据项的个数;stream:打开的文件指针(FILE*类型)。
- 返回值:成功时,返回读取到的数据项的数目(数据项的数目不等于实际读取的字节数,除非参数size等于1);错误或到达文件末尾时,返回值将小于参数nmemb,注意:fread()函数不能区分文件结尾好错误,需要使用ferror()或feof()函数来进行判断。
fclose()函数:关闭文件:
- 函数原型:int fclose(FILE* stream);
- 函数参数:stream:FILE类型指针,指向打开的文件。
- 返回值:成功返回0;失败返回EOF(即-1),并设置errno以指示错误原因。
popen()函数和fgets()函数
popen()函数:
用于创建一个子进程,并通过管道与该子进程进行通信
- 函数原型:FILE* popen(const char* command, const char* mode);
- 函数参数:command:一个字符串,表示要在子进程中执行的命令;mode:一个字符串,指定文件流的模式,可以是“r”或“w”。
- 返回值:popen函数会返回一个文件指针,通过该指针可以读取或写入与子进程相关联的管道。
fgets()函数:
用于从文件流中读取一行数据
- 函数原型:char* fgets(char* str, int size, FILE* stream);
- 函数参数:str:一个指向字符数组的指针,用于存储读取的字符串;size:最大读取字符数;
- stream:文件流指针,表示从哪个流中读取数据。
- 返回值:该函数每次读取一行字符,遇到换行符‘\n’或者读取字符已经达到最大长度size(包括换行符和末尾的‘\0’)时会停止读取,返回读取到的字符串指针,如果读取失败或者到达文件结尾则返回NULL。
C++文件读写操作
在C++中,ifstream和ofstream是用于文件输入和输出操作的类,分别代表输入文件流和输出文件流。详细使用说明如下:
ifstream(输入文件流)代码示例
#include <iostream>
#include <fstream>
int main()
{
// 打开文件
std::ifstream inputFile("input.txt");
// 检查文件是否成功打开
if (!inputFile.is_open())
{
std::cerr << "无法打开文件" << std::endl;
return 1;
}
// 读取文件内容
std::string line;
while (std::getline(inputFile, line))
{
std::cout << line << std::endl;
}
// 关闭文件
inputFile.close();
return 0;
}
ofstream(输出文件流)代码示例
#include <iostream>
#include <fstream>
int main()
{
// 打开文件
std::ofstream outputFile("output.txt");
// 检查文件是否成功打开
if (!outputFile.is_open())
{
std::cerr << "无法打开文件" << std::endl;
return 1;
}
// 写入数据到文件
outputFile << "Hello, World!" << std::endl;
outputFile << "这是一个示例文件写入操作。" << std::endl;
// 关闭文件
outputFile.close();
return 0;
}
C语言代码示例
char data[20] = {'0'};
FILE* fp = nullptr;
fp = popen("date +'%Y-%m-%d %H:%M:%S'", "r");
if(nullptr != fp)
{
if(fgets(data, sizeof(data), fp) != nullptr)
{
js_data["time"] = data;
}
else
{
js_data["time"] = "";
return;
}
}
else
{
js_data["time"] = "";
return;
}
pclose(fp);