C 与 C++ 标准库的文件操作

文章目录

  • 一、何为文件的读、写?
  • 二、相关的标准库头文件
  • 三、打开文件
  • 四、读文件
    • (一) 逐行读取(只以换行符为间隔)
    • (二) 逐段读取(以空格、制表符、换行符为间隔)
    • (三) 逐个读取
  • 五、获取文件长度
  • 六、参考资料

一、何为文件的读、写?

读文件,是指将文件内容拷贝到缓冲里;写文件,是指把缓冲里的内容写进文件里。


二、相关的标准库头文件

C:stdio.h。

C++:fstream、ifstream、ofstream。


三、打开文件

C:

// 声明
FILE* fopen(const char* filename, const char* mode);

// 使用
FILE* file = fopen("abc.md", "r");
模式名称 读写权限 是否要求文件本来就存在
r 只读不写
w 只写不读 否,若不存在则自动创建空文件;写操作会从文件头部写入数据
a 只写不读 否,若不存在则自动创建空文件;写操作会从文件尾部写入数据
r+ 可读可写
w+ 可读可写 不要求,若不存在则自动创建空文件;写操作会从文件头部写入数据
a+ 可读可写 不要求,若不存在则自动创建空文件;写操作会从文件尾部写入数据

以上 6 个模式皆以文本文件的形式打开文件,若想以二进制文件的形式打开文件,则要在上述模式中添加“b”:rb、wb、ab、rb+(或 r+b)、wb+(或 w+b)、ab+(或 a+b)。

C++:

// 声明
explicit fstream(const char* filename,
                 ios_base::openmode mode = ios_base::in | ios_base::out);

// 使用
std::fstream file("abc.md", std::fstream::in | std::fstream::out);
模式名称 描述
in(input) 拥有读权限,作为输入流,类似 cin
out(output) 拥有写权限,作为输出流,类似 cout
binary 只有该模式能以二进制形式打开文件
ate(at end) 打开文件后定位到文件末尾
app(append) 从文件尾部开始写入
trunc(truncate) 忽视文件原有内容,即把文件长度设置为 0

四、读文件

(一) 逐行读取(只以换行符为间隔)

C:

// 声明
char * fgets(char* str, int num, FILE* stream);

// 使用
FILE* file = fopen("abc.txt", "r+");
char s[100] = {0}; // 缓冲区应足够大
if (fgets(s, 100, file)) { // 换行符也会读进缓冲 s
    fputs(s);
}

C++:

// 声明
istream& istream::getline(char* s, streamsize n);

// 使用
std::fstream file("test/hello.cpp", std::fstream::in | std::fstream::out);
char s1[100] = { 0 };
file.getline(s1, 100); // 换行符不会被读进缓冲 s1
printf("%s", s1);

(二) 逐段读取(以空格、制表符、换行符为间隔)

C:

// 声明
int fscanf(FILE* stream, const char* format, ...);

// 使用
FILE* file = fopen("abc.txt", "r+");
char str[20] = {0};
fscanf(file, "%s", str);
int i;
fscanf(file, "%d", &i);

C++:

istream& istream::operator>>(/* 各种类型皆有重载 */);

string s;
int i;
cin >> s >> i;

(三) 逐个读取

C:

// 声明
int getc(FILE* stream);

// 使用
char c;
do {
    c = getc(pFile);
    if (c == '$')
        n++;
} while (c != EOF);

C++:

// 声明
int istream::get();

// 使用
std::fstream file("test/hello.cpp", std::fstream::in | std::fstream::out);
char c;
while ((c = file.get()) != -1) {
    printf("%c", c);
}
// 声明
istream& istream::get(char& c);

// 使用
std::fstream file("test/hello.cpp", std::fstream::in | std::fstream::out);
char c;
while (file.get(c)) {
    printf("%c", c);
}

五、获取文件长度

C:

// 声明
int fseek(FILE* stream, long int offset,int origin); // 设置文件位置为 origin+offset
long int ftell(FILE* stream); // 返回文件当前位置

// 使用
FILE* file = fopen("test/hello.cpp", "r+");
fseek(file, 0, SEEK_END/*文件末尾*/); // 标准库没有要求编译器支持 SEEK_END 宏
long size = ftell(file);
fseek(file, 0, SEEK_SET/*文件开头*/);

C++:

// 声明
istream& istream::seekg(streamoff off, ios_base::seekdir way);
streampos istream::tellg();

// 使用
std::fstream file("test/hello.cpp", std::fstream::in | std::fstream::out);
file.seekg(0, file.end);
int length = file.tellg();
file.seekg(0, file.beg);

六、参考资料

cplusplus.com

你可能感兴趣的:(C++,C)