ملف I/O في C ++
سؤال
كل ما أريد فعله هو طباعة محتويات readme.txt 20 مرة .. الرجاء المساعدة.
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;
}
المحلول
هذا يفعل جوبز رجل:
#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;
}
نصائح أخرى
هناك العديد من المشكلات في الكود الخاص بك. أولاً لم يتم تهيئتها. يجب أن يتم القراءة الثانية لمحتويات الملف مرة واحدة قبل الحلقة وليس بعد ذلك ، يجب عليك طباعة محتويات الملف حيث تتم طباعة ASDASD لرؤية محتويات الملف المطبوعة عدة مرات كما تعمل الحلقة.
يجب عليك القيام بذلك (رمز كاذب):
if(file is open)
{
for(int i = 0; i<20; ++i)
{
while(getline(file, line))
{
print line
}
seek to 0
}
close file
}
تعديل: في الواقع مشكلتك الحقيقية هي المتغير غير المعتاد i
. السبب الأعمق هو أنك استخدمت while
أين for
كان أكثر ملاءمة
وفقا للرمز الخاص بك ، أنت تطبع asdasd
إذا لم تكن في نهاية الملف.
عندك
int i;
وهذا i
لم يتم تهيئته.
if(!myfile.eof())
قد ترغب في فقد !
. أنت تعيد إلى بداية الملف على كل حلقة.
(كيريل لديه أيضا نقطة هنا ...)
#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;
}
لست متأكدًا مما إذا كان هذا سيصلح مشكلتك ولكن هيكلك سيء للغاية. استخدم بعض الوقت عندما لا تعرف عدد المرات التي تريد فيها حلقة ، وإلا استخدم حلقة. شيء مثل أدناه يجب أن يكون على ما يرام
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;
}
أتمنى أن يساعدك هذا.
لا أعرف لماذا تريد أن تفعل ذلك ولكن هذا الرمز يعمل:
#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;
}