2015-01-14 2 views
0

, которые я пытался сделать свою собственную версию этого примера:Почему моя удаление строки попытка не увенчается

Delete a specific line from a file

Но я не могу получить мой работать правильно. Моя текущая цель программы - удалить строку и ее информацию (которая является строкой ниже первой строки), что и делает; Однако, он также добавляет дополнительное пространство к первой линии, так что это выглядит следующим образом:

(First Line) 


(Second Line) This should be the first line. 

Вот код:

infile = ifstream; 
outfile = ofstream; 
cout<< "What string would you like to delete"; 
cin>>delstr; 
infile.clear(); 
infile.seekg(0, ios::beg); 

ofstream tempfile; 
tempfile.open("temp.txt",std::ios::app); 

while(delreset == true){ 

    if(delstr == fLine){ 
     getline(infile, fLine); 

     cout<<"String deleted.\n"; 
     delreset = false; 

     while(fLine != nothing){ 
      getline(infile, fLine); 
      tempfile<<fLine<<"\n"; 
     } 

     tempfile.close(); 
     infile.close(); 
     outfile.close(); 
     remove("example.txt"); 
     rename("temp.txt","example.txt"); 

    }else{ 

     tempfile<<fLine<<endl; 
     getline(infile, fLine); 

    } 
    outfile.flush(); 
    delreset = true; 
} 

Я удалил то, что я мог сделать это сокращенный вариант на самом деле, надеюсь, я ничего не редактировал, чтобы это не имело смысла.

+1

Красиво отформатированный пример кода, который компилирует всегда будет получить вас дальше на этом сайте. Может быть ошибка в том, что вы опубликовали, но у меня проблемы с чтением и угадыванием кода. –

+0

'delreset == true' - это условие, которое истинно только в том случае, когда истинно также delreset. Таким образом, вы можете просто написать 'while (delreset)' – MSalters

+0

. Цикл устанавливает 'delreset' значение true на каждой итерации, и нет ошибки, связанной с чтением входного файла, поэтому цикл никогда не будет останавливаться даже после того, были найдены. –

ответ

0

Что с более простой версии:

... // prepare everything as before 
while(getline(infile, fLine)) { 
    if(delstr == fLine) { // if line found do nothing 
     cout<<"String deleted.\n"; 
     getline(infile, fLine); // EDIT: and read and ignore the following line 
    } 
    else 
     tempfile<<fLine<<"\n"; // else copy it 
} 
... // here infile was read and tempfile contains the filtered output 

При таком подходе можно даже писать непосредственно в выходной файл.

К слову, cin>>delstr; слово в слово. Он останавливается при первом пробеле и игнорирует конечные пробелы. Вместо этого вы можете использовать getline(cin, delstr);.

+0

Требование OP состоит в том, чтобы удалить указанную строку ** AND ** строку, которая следует за ней. Этот код не делает последнего. –

+0

Данные испытаний дали представление о двух пронумерованных линиях. Поэтому я неправильно понял строку «string ниже первой строки» *, ссылаясь на пример. Я добавил строку EDIT, чтобы удалить следующую строку. – Christophe

0

Попробуйте что-то больше, как это вместо:

cout << "What string would you like to delete"; 
getline(cin, delstr); 
bool deleted = false; 

infile.clear(); 
infile.seekg(0, ios::beg); 

ofstream tempfile; 
tempfile.open("temp.txt", std::ios::app); 

while (getline(infile, fLine)) 
{ 
    if ((!deleted) && (fLine == delstr)) 
    { 
     getline(infile, fLine); 
     cout << "String deleted." << endl; 
     deleted = true; 
    } 
    else 
     tempfile << fLine << endl; 
} 

tempfile.close(); 
infile.close(); 
outfile.close(); 

if (deleted) 
{ 
    remove("example.txt"); 
    rename("temp.txt", "example.txt"); 
} 
else 
    remove("temp.txt"); 
+0

Когда я вызывал этот код, он мгновенно запускался и заканчивался тем, что ничего не делалось – bill

+0

Это означало бы, что 'getline()' не читает строку, вы это проверили? –

Смежные вопросы