C /以特定方式在TXT文件上附加数据

c++ / Append data on a txt file in a specific way

本文关键字:文件 数据 TXT 方式      更新时间:2023-10-16

我有一个这样的txt文件:

123456

123456

abcdef

...

使用C ,我想打开它并以以下方式添加数据

123456新数据新数据

123456新数据新数据

ABCDEF新数据新数据

...

我已经在Stackoverflow上看到了这篇文章,但它在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

...等等,直到填写整个文件。

有人可以帮我吗?

谢谢

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

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);
    }
}

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

另外,您可以使用寻求功能按行读取/覆盖您的文件行

有很多方法可以做到这一点。最安全的通常是将每行复制到新文件,将您需要的任何内容附加到该行,然后继续直至输入文件结束。

然后,您只需将数据从新文件复制到旧文件,或(如果您确定没有其他链接)删除旧文件,然后将新名称重命名为旧名称。/p>

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

将数据读为内存,然后用新数据覆盖文件更加脆弱 - 如果您在操作中间会崩溃或电源损失,则可能会破坏文件't拥有旧数据或新数据的副本。除非您真的更担心速度,否则我会避免使用它完全数据。

明显的代码:

std::ifstream input("filename");
std::ofstream output("filename2");
std::string line;
while (std::getline(input, line))
    output << line << " new data new data new datan";

从我在您中读到的问题,您想要:

  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();

这就是" ios :: app"的工作方式 - 在文件末尾添加数据。

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