2013-06-18 44 views
2

我想在指定的文件中查找一行并将其替换为我的行。我没有权限访问我将要运行的计算机上的库,所以我创建了一个自定义文件。麻烦似乎是对fstream对象的写入调用。我想知道你们有没有人可以帮忙。另外,我的getline循环在到达文件末尾之前停止,我不知道为什么。使用fstream写入

#include <iostream> 
#include <fstream> 
#include <string> 

#define TARGET2 "Hi" 

using namespace std; 

void changeFile(string fileName){ 
    fstream myStream; 
    myStream.open(fileName.c_str(),fstream::in | fstream::out);  

    string temp; 
    string temp2 = "I like deep dish pizza";  

    while(getline(myStream, temp)){ 
     if(temp == TARGET2){ 
      cout << "Match" << endl; 
      myStream.write(temp2.c_str(), 100); 
      myStream << temp2 << endl; 
      cout << "No runtime error: " << temp2 << endl;     
     } 
     cout << temp << endl; 
    } 
    myStream.close(); 
} 

int main (void){   
    changeFile("Hi.txt"); 
    return 0; 
} 

Hi.txt

Hi 
Today is June 18 
I like pizza 
I like pepperoni 

输出是:

Match 
No runtime error: I like deep dish pizza 
Hi 

回答

5
myStream.write(temp2.c_str(), 100); 
myStream << temp2 << endl; 

你为什么写这封信,文件两次,你为什么要告诉它说:“我像深盘披萨“是100个字符长?仅仅使用第二行应该做你想要的。

我认为循环结束的原因是您在读取文件时正在编写文件,导致getline混淆。如果文件很小,我只需将整个文件读入stringstream,替换要替换的行,然后将整个文件写入stringstream。在原地更改文件要困难得多。

例子:

#include <fstream> 
#include <iostream> 
#include <sstream> 

int main(int argc, char** argv) { 

    /* Accept filename, target and replacement string from arguments for a more 
     useful example. */ 
    if (argc != 4) { 
     std::cout << argv[0] << " [file] [target string] [replacement string]\n" 
      << " Replaces [target string] with [replacement string] in [file]" << std::endl; 
     return 1; 
    } 

    /* Give these arguments more meaningful names. */ 
    const char* filename = argv[1]; 
    std::string target(argv[2]); 
    std::string replacement(argv[3]); 

    /* Read the whole file into a stringstream. */ 
    std::stringstream buffer; 
    std::fstream file(filename, std::fstream::in); 
    for (std::string line; getline(file, line);) { 
     /* Do the replacement while we read the file. */ 
     if (line == target) { 
      buffer << replacement; 
     } else { 
      buffer << line; 
     } 
     buffer << std::endl; 
    } 
    file.close(); 

    /* Write the whole stringstream back to the file */ 
    file.open(filename, std::fstream::out); 
    file << buffer.str(); 
    file.close(); 
} 

运行,如:

g++ example.cpp -o example 
./example Hi.txt Hi 'I like deep dish pizza' 
+0

我因为第二行写两次似乎没有工作。我会尝试stringstream方法,看看它是如何发展的。 –

+0

@BabbuMaan我列举了一个如何做到这一点,以防万一它有用。 –