Несколько вещей.
Сначала вы полностью прочитали файл, просто для того, чтобы сосчитать количество строк, а затем прочитали его во второй раз, чтобы обработать его, создав образ в памяти в v
.Почему бы просто не прочитать его в первый раз, а сделать все остальное в образе памяти?(v.size()
затем даст вам количество строк, поэтому вам не нужно их считать.)
И вы никогда не будете использовать счет в любом случае.
Во-вторых, как только выЕсли вы достигли конца файла в первый раз, устанавливается failbit
;все дальнейшие операции не выполняются, пока он не будет сброшен.Если вам нужно прочитать файл дважды (скажем, потому что вы полностью отказались от v
), то вы должны сделать myfile_in.clear()
после первого цикла, но перед поиском в начале.
Вы только тестируетедля is_open
после прочтения файла один раз.Этот тест должен быть выполнен сразу после открытия.
Вы также установили noskipws
, хотя вы не выполняете никаких форматированных вводов, на которые это может повлиять.
Финальный while
- этоочень подозреваемыйПоскольку вы не выполнили clear
, вы, вероятно, никогда не войдете в цикл, но если вы это сделали, вы очень быстро начнете доступ за пределами: после прочтения n строк размер v
будет равен n, ноВы читаете его с индексом i
, который будет n * h
.
Наконец, вы должны явно закрыть выходной файл и проверить на ошибки после закрытия, на всякий случай.
Мне не понятно, что вы пытаетесь сделать.Если все, что вы хотите сделать, это вставить h
пустых строк между каждой существующей строкой, что-то вроде:
std::string separ( h + 1, '\n' );
std::string line;
while ( std::getline( myfile_in, line ) ) {
myfile_out << line << separ;
}
должно помочь.Нет необходимости хранить полный ввод в памяти.(В этом отношении вам даже не нужно писать программу для этого. Что-то простое sed 's:$:\n\n\n\n:' < infile > outfile
сделает свое дело.)
РЕДАКТИРОВАТЬ:
Читая другие ответы, япоймите, что я, возможно, неправильно понял проблему, и что он хочет выводить только каждую h
-ю строку.Если это так:
std::string line;
while ( std::getline( myfile_in, line ) ) {
myfile_out << line << '\n';
for ( int count = h - 1; h > 0; -- h ) {
std::getline( myfile_in, line );
// or myfile_in.ignore( INT_MAX, '\n' );
}
}
Но опять же, другие инструменты кажутся более подходящими.(Я бы последовал совету Титона и использовал бы AWK.) Зачем писать программу на языке, который вы не очень хорошо знаете, когда инструменты для этой работы уже доступны.