3

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

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

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

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

我怎样才能在 c++ 中做到这一点?有谁能够帮助我?

谢谢,黄

4

3 回答 3

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;
}
于 2010-03-20T23:29:58.513 回答
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”的行。

于 2010-03-20T23:41:05.917 回答
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.
}

I've probably screwed up the use of the insertion operator. But, you can reference MSDN for the exactitudes of using the wfstream. I'd absolutely advise against using any C solution, all their string manipulation functions truly suck.

于 2010-03-20T23:41:47.523 回答