2017-01-20 4 views
0

Допустим, у меня есть текстовый файл, содержащий что-то вроде:Как я могу пометить строки существующего файла?

Четыре

оценка

и

семь

лет

назад

...

Я хочу, чтобы иметь возможность маркировать эти строки так, чтобы после запуска программы, файл выглядит следующим образом:

1.Four

2.score

3.And

4.seven

5.years

6.ago

...

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

std::string file = "set_test - Copy.txt"; 
     std::ifstream in_test{file}; 
     std::vector<std::string> lines; 
     while(in_test) { 
      std::string temp; 
      getline(in_test, temp); 

      lines.push_back(temp); 
     } 
     in_test.close(); 

     std::ofstream out_test{file}; 
     for(unsigned int i = 0; i < lines.size(); ++i) { 
      out_test << i+1 << '.' << lines[i] << '\n'; 
     } 

На вершине будучи тяжеловесным, это решение также маркирует линию за пределами последней строки текст.

У кого-нибудь есть лучшее решение этой проблемы?

ответ

0

Причина вашей проблемы эта структура

while (stream is good) 
    read from stream 
    do something 

, как он будет читать слишком много. (См. this Q&A для объяснения.)
Что происходит, так это то, что самый последний getline, тот, который на самом деле доходит до конца файла, потерпит неудачу и оставьте temp пустым.
Затем вы добавляете эту пустую строку в свои строки.

«канонической» структура петли поток-чтение

while (attempt to read) 
    do something with the result 

в вашем случае,

std::string temp; 
while (getline(in_test, temp)) { 
    lines.push_back(temp); 
} 

Если вы пишете в другой файл вам не нужно хранить ничего, кроме последнего линия; вы можете написать каждую строку сразу.
Если вы хотите заменить оригинал, вы можете заменить старый на новый.
Что-то вроде этого:

std::ifstream in_test{"set_test - Copy.txt";} 
std::ofstream out_test{"set_test - Numbered.txt"}; 
if (!in_test || !out_test) { 
    std::cerr << "There was an error in the opening of the files.\n"; 
    return; 
} 

int i = 1; 
std::string line; 
while (getline(in_test, line) && out_test << i << '.' << line << '\n') { 
    i++; 
} 
Смежные вопросы