c ++中的ios :: app,out和trunc有什么区别?

时间:2018-01-03 22:01:18

标签: c++

我知道默认文件打开模式是 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”。

2 个答案:

答案 0 :(得分:9)

ios::outstd::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();

当我调用此函数时,文件的数据将被完全覆盖(即使要写入的数据少于以前写入的数据),并且如果要写入的数据为空,这只会删除文件中的所有内容