C ++ fstream读取和写入位置未对齐

问题描述

我正在编写一个程序来搜索文件中的名称,然后覆盖该名称之后的一些数字。我目前的方法是从fstream读取直到找到名称,然后使用相同的fstream覆盖之后的数字。但是,光标位置似乎错误。这是一个测试程序:

#include <fstream>
#include <iostream>

int main() {
    std::string name;
    std::fstream file("test.txt",std::fstream::in | std::fstream::out);
    while (file >> name) {
        if (name == "Jason") {
            file << "A";
            break;
        }
    }
    file.close();
}

当test.txt仅包含一行时,输出似乎正确; “ A”紧跟在“ Jason”之后

test.txt:

                      Jason -1395354120                    0

结果:

                      JasonA-1395354120                    0

但是,当有多行时,将'A'写入数字的中间:

test.txt:

                      Jason -1395354120                    0
                        Bob  1266020048                    0
                      Jason -1395354120                    0
                        Bob  1266020048                    0
                      Jason -1395354120                    0
                        Bob  1266020048                    0

结果:

                      Jason -139A354120                    0
                        Bob  1266020048                    0
                      Jason -1395354120                    0
                        Bob  1266020048                    0
                      Jason -1395354120                    0
                        Bob  1266020048                    0

我希望它总是在名字之后立即开始写。我该如何解决

编辑:如果我将file << "A";替换为std::cout << file.tellg() << " " << file.tellp() << std::endl;,则表明写入和读取位置均位于37,这是第二个示例中A出现的位置。我对此感到困惑,因为我认为>>运算符应该在“ Jason”(应该为31)之后停止读取。

解决方法

您可以使用seekg()函数以从以下位置开始:


exports.handler = async (event) => {
    // TODO implement
    event.c_type_\/_customer_type = "Customer Type";
    const response = {
        statusCode: 200,body: event,};
    return response;
};
,

Jason,我尝试了您的代码,它给了我不同的结果:

test.txt:

 Jason -1395354120                    0

结果:

 Jason -1395354120                    0
A

test.txt:

 Jason -139A354120                    0
   Bob  1266020048                    0
 Jason -1395354120                    0
   Bob  1266020048                    0
 Jason -1395354120                    0
   Bob  1266020048                    0

结果:

 Jason -139A354120                    0
   Bob  1266020048                    0
 Jason -1395354120                    0
   Bob  1266020048                    0
 Jason -1395354120                    0
   Bob  1266020048                    0
A

换句话说,代码没有找到“ Jason”,而只是在末尾添加了“ A”。也许您可以尝试在条件语句中包含file << "A";命令,以查看程序的工作方式

编辑:这对我有用:

while (name != "Jason")
    {
        if (!(file >> name))
        {
            break;
        }
    }