2010-03-20 110 views
2

我有一個文本文件看起來像這樣:如何編輯C++文本文件中的第一行?

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++中做到這一點?有誰能夠幫助我?

感謝, 晃

+0

你想從第三項減去一個嗎?可能第三項是否定的? – Potatoswatter 2010-03-20 23:33:45

回答

2
#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; 
} 
+0

謝謝你的解決方案。但我正在尋找一種更「動態」的方式,這意味着我可以將20改爲任意數字而不會覆蓋最後一個數字。例如:20,19.9999,19.9998,17.36 ... – root 2010-03-20 23:34:43

+1

@tsubasa:那麼你應該在你的問題中指定。 – 2010-03-20 23:45:10

+1

添加了一個實際滿足額外規格的解決方案,並且可以處理比前一個更長的新號碼。 :) – 2010-03-21 00:06:29

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

如果你想寫韓元」的數據t「適合」你想保存的其他東西之間,你需要重新編寫剩餘的文件,通常從舊文件複製到新文件,根據需要修改數據H。

編輯:這樣的事情:

#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」寫出該行。

+0

和'file.flush();'在編輯之後如果你沒有添加新行 – 2018-03-08 15:42:35

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解決方案,它們的所有字符串操作函數真的很吸引人。

相關問題