【问题标题】:c++ / Append data on a txt file in a specific wayc ++ /以特定方式将数据附加到txt文件
【发布时间】:2015-05-07 03:59:23
【问题描述】:

我有一个这样的 txt 文件:

123456

123456

abcdef

...

用C++,我想用下面的方式打开并添加数据

123456新数据新数据

123456新数据新数据

abcdef 新数据新数据

...

我已经在 stackOverflow 上看到了这个 post,但它是在 Python 中的。

我用过这个功能

std::ofstream file_to_save;
file_to_save.open(path, ios::out | ios::app);

但它将数据添加到文件末尾而不是每个单词旁边。

编辑: 实际上,我在循环中连续添加日期,而不是一次性添加所有内容。这就是困难。所以我有我的所有日​​期的文件,然后在一个循环中,我创建新数据。假设“新数据”,然后我想将这个新数据(总是不同的)分配给已经存在的文件。

123456

123456

abcdef

...

我在循环“新数据 1”中创建新数据,然后想像这样添加到文件中

123456个新数据1

123456

abcdef

...

然后在我的循环中的第 2 步,我创建“新数据 2”然后想像这样添加到文件中

123456个新数据1

123456新数据2

abcdef

...

然后在我的循环中的第 3 步,我创建“新数据 3”然后想像这样添加到文件中

123456个新数据1

123456新数据2

abcdef 新数据 3

... 以此类推,直到填满整个文件。

有人可以帮我吗?

谢谢

【问题讨论】:

  • 如何读取当前行,将数据附加到该行并覆盖文件?无论如何,您都必须阅读该行,以便覆盖文件
  • 您可以改为执行您的 python 解决方案所做的事情。读取整个文件,然后写入整个文件,附加到每一行。
  • 你的意思是,读取每一行,保存第一个数据并覆盖在文件中?我没弄好。
  • 我已经回复@lilouch

标签: c++ text ofstream


【解决方案1】:

您必须将现有文件的内容存储在一个数组中 或向量并将其写回同一个文件。

void appendToFile(string sFilename, int nInsertAt, string sDataToInsert)
{
    std::ifstream infile("output.txt");

    string line;
    vector<string> vLines;

    while (std::getline(infile, line))
    {
        vLines.push_back(line);
    }

    infile.close();
    std::ofstream outfile("output.txt");

    for (int i = 0; i < vLines.size(); i++)
    {
        char buff[1024];
        if (i == nInsertAt)
        {
            sprintf(buff, "%s %s", vLines[i].c_str(), sDataToInsert.c_str());
            outfile << buff << endl;
        }
        else
        {
            outfile << vLines[i] << endl;
        }

    }

    outfile.close();
}

void test()
{
    for (int i = 0; i < 10; i++)
    {
        char buff[1024];
        sprintf(buff, "new data %d", i);
        appendToFile("output.txt", i, buff);
    }
}

【讨论】:

  • 感谢您的回答,但没有奏效……我的意思不是我想要的。我已经编辑了我的问题,我认为现在更清楚了。提前致谢
  • 完美,效果很好!非常感谢@Christian - PMP。我明白了。
【解决方案2】:

读取所有文件并将字符串存储在向量中。对于向量中的每个元素,附加您的新数据,然后将它们写入文件中,完全覆盖您的文件。

或者,您可以使用搜索功能逐行读取/覆盖您的文件

【讨论】:

  • 感谢您的回答,但没有奏效……我的意思不是我想要的。我已经编辑了我的问题,我认为现在更清楚了。提前致谢
  • 但我的回答正是你想要的。当有人写“for each element”时,这意味着一个for循环。
  • 我不是这样弄的。谢谢
【解决方案3】:

有很多方法可以做到这一点。最安全的方法通常是将每一行复制到一个新文件中,在该行添加任何你需要的内容,然后继续直到输入文件的末尾。

然后您可以将数据从新文件复制回旧文件,或者(如果您确定没有其他链接)删除旧文件,并将新文件重命名为旧名称。

或者,您可以从旧文件复制到临时文件,然后在将数据复制回旧文件时处理数据(最后删除临时文件)。

将数据读入内存,然后用新数据覆盖文件要脆弱得多——如果您在操作过程中遇到崩溃或断电,您的文件很可能会被破坏(即,您不'没有旧的新数据的副本。我会避免它,除非你真的比可靠性更担心速度而不是你不介意破坏的可能性完整的数据。

明显的代码:

std::ifstream input("filename");
std::ofstream output("filename2");

std::string line;

while (std::getline(input, line))
    output << line << " new data new data new data\n";

【讨论】:

  • 感谢您的回答,但没有奏效……我的意思不是我想要的。我已经编辑了我的问题,我认为现在更清楚了。提前致谢
【解决方案4】:

根据我在你的问题中读到的内容,你想要:

  1. 读取线
  2. 向其中添加新数据
  3. 存储所有更新的行
  4. 用新行覆盖文件

这是一种可能的实现方式:

ifstream infile("filetobeupdated.txt");
if(!infile) error("Can't open file: ", filetobeupdated);

// vector holding old data
string line;
vector<string>oldlines;

while(getline(infile,line)) oldlines.push_back(line);

infile.close();

// vector holding newdata
vector<string>newdata;

// vector holding updated data
vector<string>updateddata;

// concatenate old line + new data 
for(size_t i=0, i<oldlines.size();i++) updateddata.push_back(oldlines[i]+newdata[i]);                                                     

// overwrite old file with new data
ofstream onfile("filetobeupdated.txt");
if(!onfile) error("Can't open file: ", filetobeupdated);

for(size_t i=0, i<newdata.size();i++) onfile << newdata[i] <<'\n';

onfile.close();

【讨论】:

    【解决方案5】:

    这就是“ios::app”的工作原理——在文件末尾添加数据。

    您可能希望先读取每一行,然后覆盖所有行。

    【讨论】:

    • 是的,我用过它,但就我而言,它不适用于我想要的。查看我的编辑
    猜你喜欢
    • 2016-01-01
    • 2015-04-13
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2017-10-27
    • 2018-05-05
    相关资源
    最近更新 更多