如何在c ++中编辑文本文件中的第一行?

时间:2010-03-20 23:24:57

标签: c++ file text line edit

我有一个文本文件,如下所示:

100 50 20 90
4.07498 0.074984
37.1704 28.1704
20.3999 14.3999
48.627 35.627 ....

我需要编辑此文件,以便除第一行第3项外,所有内容都保持不变。输出应该如下所示:

100 50 19 90
4.07498 0.074984
37.1704 28.1704
20.3999 14.3999
48.627 35.627
....

我怎么能用c ++做呢?有谁能够帮我?

谢谢, 晃

3 个答案:

答案 0 :(得分:1)

#include <stdio.h>

int main()
{
      FILE *pFile;
      pFile = fopen("example.txt", "r+");
      fseek(pFile, 7, SEEK_SET);
      fputs("19", pFile);
      fclose(pFile);
      return 0;
}

编辑:以上当然主要是个玩笑。真正的方法是读取第一行,将其拆分为多个部分,更改所需的数字,写出来,然后跟随所有其余行。如果我们知道文件在第一行包含四个整数(浮点数?),那么这样就足够了:

#include <fstream>
#include <iostream>
using namespace std;

int main ()
{
    ifstream in("in.txt");
    ofstream out("out.txt");
    float v1, v2, v3, v4;
    in >> v1 >> v2 >> v3 >> v4;
    v3 = 19.1234; // <- Do whatever you need to here.
    out << v1 << " " << v2 << " " << v3 << " " << v4;
    out << in.rdbuf();
    out.close();
    in.close();
    return 0;
}

答案 1 :(得分:1)

只要结果与原始长度相同(或更短,并且您不介意添加空格来覆盖差异),这很容易:寻找您想要进行修改的位置,编写新数据,你已经完成了:

#include <fstream>
#include <ios>

int main() { 
    std::fstream file("yourfile.txt", std::ios::in | std::ios::out);
    file.seekp(7);
    file << "19";
    return 0;
}

如果您要编写的数据不适合您要保留的其他内容,则需要重新编写文件的其余部分,通常是从旧文件复制到新文件,修改在整个过程中需要的数据。

编辑:类似这样的事情:

#include <fstream>
#include <ios>
#include <iterator>
#include <vector>

int main() { 
    std::vector<double> data;

    std::fstream file("yourfile.txt", std::ios::in | std::ios::out);
    std::copy(std::istream_iterator<double>(file), 
        std::istream_iterator<double>(),
        std::back_inserter(data));
    file.clear();
    file.seekp(0);
    data[2] = 19.98;
    std::copy(data.begin(), data.end(), std::ostream_iterator<double>(file, " "));
    return 0;
}

这有一些你可能不想要的效果 - 特别是,就目前而言,它会摧毁原始可能具有的任何“线”导向结构,并简单地将结果写为一条长线。如果你想避免这种情况,你可以(例如)一次读一行,转换行中的数字(例如,然后将其放入字符串流中,然后将其作为双精度读出),修改它们,放入结果返回一个字符串,并在末尾写出一行“\ n”。

答案 2 :(得分:0)

您可以使用std :: wfstream。

#include <fstream>

using namespace std;
int main() {
    wfstream file(L"example.txt", std::ios::in | std::ios::out);
    std::wstring first, second, third; // The extraction operator stops on whitespace
    file >> first >> second >> third;
    third = L"Whatever I really, really, want!";
    file << first << second << third;
    file.flush(); // Commit to OS buffers or HDD right away.
}

我可能搞砸了插入操作符的使用。但是,您可以参考MSDN了解使用wfstream的精确程度。我绝对建议不要使用任何C解决方案,所有的字符串操作功能都真的很糟糕。