سؤال

كل ما أريد فعله هو طباعة محتويات 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;
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top