I / O file in C ++
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;
}
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;
}