2016-03-27 3 views
-1

Я пытаюсь искать и заменять в текстовом файле, но он не работает, я знаю, что его простое ощущение, что я потерял что-то маленькое. Я пытаюсь заменить Electric несимметричным символом. Может кто-нибудь мне помочь?Поиск и замена в текстовом файле

Благодаря

#include <string> 

#include <fstream> 
#include <iostream> 

using namespace std; 

    int main() { 

    string line; 
    ifstream myfile("test.txt"); 
    if (!myfile.is_open()) 
    { 
     cout << "cant open"; 
     return 1; 
    } 
    ofstream myfile2("outfile.txt"); 

    std::string str(""); 
    std::string str2("Electric"); 
    while (getline(myfile, line)) 
    { 
     std::size_t found = str.find(str2); 

     found = str.find("Electric"); 
     if (found != std::string::npos) { 
      str.replace(str.find(str2), str2.length(), ""); 
      myfile2 << found << "\n"; 
      //std::cout << line << "\n"; 
     } 

     //myfile2 << str2 << "\n"; 
    } 
     remove("test.txt"); 
     rename("outfile.txt", "test.txt"); 
     return 0; 
} 
+0

Что (как) не (она) работает? – SolaGratia

+0

Например, у меня есть полный абзац в текстовом файле, который я создал, но я хочу просто удалить из него строку «Electric» и заменить его пустым символом пробела. Но буквально ничего не происходит, когда я запускаю программу в текстовый файл. @BjarneStroustrup – DavidA

+0

Вы пытаетесь изменить файл? – ZDF

ответ

0
int main() 
{ 
    using namespace std; 

    ifstream is("in.txt"); 
    if (!is) 
    return -1; 

    ofstream os("out.txt"); 
    if (!os) 
    return -2; 

    string f = "Electric"; 
    string r = ""; 

    string s; 
    while (getline(is, s)) // read from is 
    { 
    // replace one: 
    //std::size_t p = s.find(f); 
    //if (p != std::string::npos) 
    // s.replace(p, f.length(), ""); 

    // replace all: 
    for (size_t p = s.find(f); p != string::npos; p = s.find(f, p)) 
     s.replace(p, f.length(), r); 

    os << s << endl; // write to os 
    } 

    return 0; 
} 
+0

Спасибо за вашу помощь, я очень ценю это. Я не знаю, если бы он только меня не понимал, но я в конечном итоге заменил его тем, что вы сделал и поместил мой код в то, что вы создали, но все еще не работает. @ZDF – DavidA

+0

См. обновленный ответ. Я только что очистил и скопировал ваш код. Обратите внимание, что ваш код удаляет только одно изображение в строке. – ZDF

+0

См. обновленный ответ. код для _replace all_. – ZDF

0

Неочищенный раствор:

#ifndef _STREAMBUF_H 
#include <streambuf> 
#endif 


void ReplaceInFile(string inputfile, string outputfile, string replace_what, string replace_with) { 

    //Read file into string 
    ifstream ifs(inputfile); 
    string inputtext((istreambuf_iterator<char>(ifs)), 
     istreambuf_iterator<char>()); 
    ifs.close(); 


    //Replace string 
    size_t replace_count = 0; 
    size_t found = !string::npos /*not npos*/; 
    while (!(found == string::npos)) { 
     found = inputtext.find(replace_what, found); 
     if (found != string::npos) { 
      ++replace_count; 
      inputtext.replace(found, replace_what.length(), replace_with); 
     } 
    } 

    //Output how many replacements were made 
    cout << "Replaced " << replace_count, (replace_count == 1) ? cout << " word.\n" : cout << " words.\n"; 

    //Update file 
    ofstream ofs(outputfile /*,ios::trunc*/); //ios::trunc with clear file first, else use ios::app, to append!! 
    ofs << inputtext; //output now-updated string 
    ofs.close(); 
} 

Пример использования:

ReplaceInFile("tester.txt", "updated.txt", "foo", "bar");