Domanda

tutto quello che voglio fare è stampare il contenuto del Readme.txt 20 volte .. si prega di aiuto.

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;
}
È stato utile?

Soluzione

Questo fa l'uomo di posti di lavoro:

#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;
}

Altri suggerimenti

ci sono diversi problemi con il vostro codice. Per prima cosa non è inizializzata. Seconda lettura del contenuto del file dovrebbe essere fatto una volta prima che il ciclo non dopo, si dovrebbe stampare il contenuto del file in cui viene stampato asdasd per vedere il contenuto del file stampato tutte le volte che viene eseguito il ciclo.

Si dovrebbe fare questo (pseudocodice):

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

Modifica In realtà il problema vero è la variabile i non inizializzata. La ragione più profonda è che si è utilizzato while dove for è stato più appropriato

Secondo il codice, si sta stampando asdasd se non si è alla fine del file.

Hai

int i;

e questo i non è inizializzata.

if(!myfile.eof())

Si potrebbe desiderare di perdere il !. Si sono riavvolgimento all'inizio del file su ogni circuito.

(Kiril ha anche un punto qui ...)

#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;
}

Non sono sicuro se questo sarà a risolvere il problema, ma la struttura è piuttosto male. Utilizzare un po 'quando non si sa quante volte si desidera loop, altrimenti utilizzare un ciclo for. Qualcosa come di seguito dovrebbe essere ok

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;
}

Spero che questo aiuti.

Non so perché si vuole fare questo, ma questo codice funziona:

#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;
 }

Se il file non cambia durante l'iterazione, questo è ancora meglio

 #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;
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top