2010-11-17 2 views
2

все, котор я хочу сделать, это распечатать содержимое readme.txt 20 раз .. пожалуйста помогите.файл i/o in C++

int main() 
{ 
     ifstream myfile; 
     string line; 
     int i; 
     myfile.open ("readme.txt"); 

     if (myfile.is_open()){ 
       while (i<20){ 
         i++; 
         if(!myfile.eof()){ 
           cout << "asdasd" << "\t"; 
           myfile.seekg(0, ios::beg); 
         } 
         getline (myfile,line); 
         cout << line << endl; 
       } 
       cout << endl; 
       myfile.close(); 
     } 
     else cout << "Unable to open file"; 
     return 0; 
} 
+2

и в чем проблема? –

+0

его, похоже, не работает ... все, что я получаю, это файл, напечатанный один раз, а затем строка «asdasd» напечатана 10 раз (поскольку getline также увеличивает i), а файл имеет длину 10 строк .... –

+2

Вы ступили через ваш код по строкам? – JLWarlow

ответ

1

Это делает работу человек:

#include <iostream> 
#include <vector> 
#include <fstream> 

int main() 
{ 
std::ifstream myfile; 
std::string content; 
std::string line; 
myfile.open ("Readme.txt"); 

if (myfile.is_open()){ 

    if(!myfile.eof()) 
    { 
    getline (myfile,line);  
    content.append(line); 
    } 

    while (!myfile.eof()){ 
    getline (myfile,line); 
    content.append("\n"); 
    content.append(line); 
    } 

    myfile.close(); 

    for(int i = 0; i < 20; i++) 
    std::cout << content << std::endl; 
} 
else std::cout << "Unable to open file"; 
return 0; 
} 
+0

Это простое решение. Для высокой производительности с очень большими файлами подумайте об использовании строкового потока. –

0

Вы должны сделать это (псевдокод):

if(file is open) 
{ 
    for(int i = 0; i<20; ++i) 
    { 
    while(getline(file, line)) 
    { 
     print line 
    } 
    seek to 0 
    } 
    close file 
} 

Edit: На самом деле ваша реальная проблема заключается в неинициализированное переменной i. Более глубокая причина заключалась в том, что вы использовали while, где for был более уместным

+0

Я не думаю, что это ... :) –

+0

Нет, это не так, как я вижу –

+0

Эмм ... неправильно. ;-) – DevSolar

0

В соответствии с вашим кодом вы печатаете asdasd, если вы НЕ в конце файла.

+0

Несмотря на это, cout << line имеет какое-либо отношение к if, если –

+0

@Ash, нет, и это не проблема. Он выводит и перематывает в начало файла каждую строку, что я могу сказать. –

+0

Возможно, ваше право. Раньше я никогда не пользовался поиском. –

0

Вы

int i; 

и это i не инициализирован.

+0

сделал это ... все еще не работает .. –

+0

Итак, в чем проблема вообще? –

+0

По умолчанию компилятор C++ инициализирует целые числа в 0 без значения, если задано. –

0
if(!myfile.eof()) 

Возможно, вы захотите потерять !. Вы перематываете начало файла в каждом цикле.

(Кирил также имеет точку здесь ...)

+0

Я сделал это непреднамеренно ... удалил ... все еще проблема сохраняется ..: P –

1

Есть несколько проблем с вашим кодом. сначала i не инициализируется. Во втором чтении содержимое файла должно быть выполнено один раз перед циклом после этого, вы должны распечатать содержимое файла, в котором печатается asdasd, чтобы просмотреть содержимое файла, напечатанное столько раз, сколько цикл выполняется.

0
#include <iostream> 
#include <algorithm> 
#include <fstream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::ifstream ifs("readme.txt"); 
    std::vector<char> filebuffer; 

    ifs.seekg (0, std::ios::end); 
    size_t size = static_cast<size_t>(ifs.tellg()); 
    ifs.seekg (0, std::ios::beg); 

    filebuffer.resize(size); 
    ifs.read(&filebuffer[0], size); 

    for(int i = 0; i < 20; ++i) 
     std::copy(filebuffer.begin(), filebuffer.end(), 
      std::ostream_iterator<char>(std::cout)); 

    return 0; 
} 
0

Не уверен, что это исправит вашу проблему, но ваша структура довольно плохая. Используйте некоторое время, когда вы не знаете, сколько раз вы хотите использовать цикл, иначе используйте цикл for. Что-то вроде ниже должно быть в порядке

int main() 
{ 
    ifstream myfile; 
    string content; 
    string line; 
    myfile.open ("readme.txt"); 
    while(!myfile.eof()){ 
      getline (myfile,line); 
      content += line; 
    } 
    myfile.close(); 

    for(int i = 0; i < 20; i++) 
    { 
      cout << content << endl; 
    } 

    return 0; 
} 

Надеюсь, это поможет.

+0

Это добавит последнюю строку дважды. (Как правило, рекомендуется использовать 'line', как это обычно бывает, - по крайней мере, изменить это на пустую строку.) – sbi

+0

Я просто написал код из памяти ... вот почему так много ошибок .. в любом случае спасибо u за ур ответ. –

0

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

#include <iostream> 
#include <fstream> 
using std::cout; 
using std::endl; 

int main(int argc,char* argv[]) 
{ 
    std::fstream myfile; 
    for (int i=0; i<20; i++) 
    {  
     myfile.open("main.cpp",std::fstream::in); 
     if (myfile) 
     { 
      cout << myfile.rdbuf() << endl; 
      cout << "FINISH" << endl; 
     } 
     else 
      cout << "Error" << endl; 
     myfile.close(); 
    } 
    return 0; 
} 

Если файл не изменяется во время итерации, это еще лучше

#include <iostream> 
#include <fstream> 

using std::cout; 
using std::endl; 

int main(int argc,char* argv[]) 
{ 
    std::fstream myfile; 
    myfile.open("main.cpp",std::fstream::in); 
    for (int i=0; i<20; i++) 
    {  
     if (myfile) 
     { 
      cout << myfile.rdbuf() << endl; 
      cout << "FINISH" << endl; 
     } 
     else 
      cout << "Error" << endl; 
    } 
    myfile.close(); 
    return 0; 
} 
+0

Вы должны нажать кнопку редактора, чтобы переформатировать этот код как код - выглядит довольно забавно. – bgporter