读文件,是指将文件内容拷贝到缓冲里;写文件,是指把缓冲里的内容写进文件里。
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