我知道默认文件打开模式是 out 。我认为 out 会覆盖文件中的数据,但在以下代码中,年龄数据不会覆盖名称数据。< / p>
#include <fstream>
#include <iostream>
using namespace std;
int main () {
char data[100];
// open a file in write mode.
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);
// write inputted data into the file.
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
// again write inputted data into the file.
outfile << data << endl;
// close the opened file.
outfile.close();
// open a file in read mode.
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;
// write the data at the screen.
cout << data << endl;
// again read the data from the file and display it.
infile >> data;
cout << data << endl;
// close the opened file.
infile.close();
return 0;
然后我对文件的三种打开模式感到困惑 - app,out,trunc。
如果名称I输入“Zara”并且年龄为“9”,则输出应为“9ara”。但事实并非如此。它是“Zara 9”。
答案 0 :(得分:9)
ios::out
是std::ofstream
的默认模式,这意味着可以使用输出操作(即您可以写入文件)。
ios::app
( append 的缩写)意味着不是从头开始覆盖文件,而是在文件末尾完成所有输出操作。这仅在文件也打开输出时才有意义。
ios::trunc
( truncate 的缩写)表示在打开文件时,会立即删除旧内容。同样,只有当文件也打开输出时,这才有意义。
您的代码只使用默认的ios::out
模式。所以它从文件的开头开始写,但不会删除旧内容。因此,新内容将覆盖已经存在的内容 - 如果文件最初为10个字节,并且您编写3个字节,则结果将是您写入的3个字节,后跟原始内容的剩余7个字节。更具体地说,如果文件最初包含:
Firstname Lastname
30
然后您编写FN LN
然后20
(每个后面都有换行符),生成的文件将如下所示:
FN LN
20
Lastname
30
因为你只覆盖文件的前9个字节(假设是Unix风格的换行符)。
打开文件后,文件的所有输出都会相继写入,除非您使用outfile.seekp()
转到其他位置。对于您编写的每件事情,它都不会回到文件的开头。如果使用seekp()
,则ios::app
无效;然后每次写入都在文件的末尾。
答案 1 :(得分:1)
对巴尔玛的答案稍作修正。我认为流的类型不仅意味着ios :: out,而且还意味着ios :: trunc(我不确定,但是ios :: out也可能意味着ios :: trunc)。
这是具体示例:
ofstream fich;
fich.open("archivo.txt");
for (unsigned i = 0; i < ag.n_pers && !fich.fail(); ++i) {
escribir_persona(fich, ag.pers[i]);
}
if (fich.fail()) {
ok = ERROR;
}
else {
ok = OK;
}
fich.close();
当我调用此函数时,文件的数据将被完全覆盖(即使要写入的数据少于以前写入的数据),并且如果要写入的数据为空,这只会删除文件中的所有内容