C++ ค้นหาบรรทัดจากไฟล์ข้อความและอัปเดต/เขียนบรรทัด

ฉันมีไฟล์บัญชีธนาคารที่โปรแกรมควรอ่านได้ ฟังก์ชั่นนี้ใช้งานได้ในขณะนี้ด้วยการใช้ ifstream แต่ฉันต้องการให้โปรแกรมอ่านบรรทัดที่ 6 ของไฟล์ข้อความ (ซึ่งมีค่า 'สมดุล') แล้วอัปเดตตามต้องการ (ลบและแทนที่ด้วยค่าใหม่)

ฉันใช้ for loop เพื่อค้นหาการเคลื่อนที่ผ่านเส้นต่างๆ แต่ฉันจะอัปเดตได้อย่างไรเมื่อจำเป็น (การถอนและการฝากเงินจะอัปเดตยอดคงเหลือ)

นี่คือรหัสที่ฉันมีตอนนี้:

ifstream file;
string line;
file.open ("accounts.txt", ios::in); 

for(int i = 0; i < 6; ++i)    //6 being the 6th line
      {
         getline(file, line);
      }

อะไรจะเกิดขึ้นต่อไปคน? ขอบคุณ :)


person PJ_Boy    schedule 25.05.2013    source แหล่งที่มา
comment
ไฟล์ของคุณจะใหญ่แค่ไหน?   -  person itsols    schedule 25.05.2013
comment
เป็นไฟล์ข้อความขนาดเล็กประมาณ 10 บรรทัด   -  person PJ_Boy    schedule 25.05.2013


คำตอบ (1)


หากไฟล์ของคุณมีขนาดเล็กมากดังที่คุณได้กล่าวไว้ คุณอาจนำไฟล์นั้นมาไว้ในอาร์เรย์ของสตริง (หนึ่งองค์ประกอบต่อบรรทัดของข้อความ) จากนั้นทำการเปลี่ยนแปลงอาร์เรย์และเขียนอาร์เรย์ทั้งหมดกลับไปยังไฟล์อีกครั้ง

ตัวอย่างเช่น คุณสามารถอ่านมันลงในอารียาได้ดังนี้:

//assuming you've defined the array A
for(int i = 0; i < 6; i++)    //NOTE: I've changed the loop counter i
      {
         getline(file, line);
         A[i] = line;
         cout << A[i] < "\n"; //This is the NEW LINE I wanted you to put
         //If the ABOVE line gives nothing, you ought to check your TXT file.
      }
//Change line 6
A[5] = "555.00";
//Now reopen the file to write
ofstream Account ("accounts.txt");
if (Account.is_open())
  {
    for(i=0;i<6;i++)
       {//NOTE THAT I HAVE INCLUDED BRACES HERE in case you're missing something.
        Account << A[i] << "\n"; //Loop through the array and write to file
       }
    Account.close();
  }

ฉันไม่ได้ทดสอบสิ่งนี้ แต่ฉันคิดว่ามันโอเค โค้ดเพิ่มเติม: หากคุณเพิ่มโค้ดต่อไปนี้ที่ส่วนท้ายของโค้ดหลัก คุณจะเห็นเนื้อหาจากอาร์เรย์ และหากสิ่งนี้ไม่แสดงสิ่งใดเลยแสดงว่าไฟล์ของคุณว่างเปล่า

for(int i = 0; i < 6; i++)
   {
    cout << A[i] < " This is a row with data\n";
   }

หมายเหตุ: แม้ว่าฉันต้องการช่วยคุณในการชี้แจงประเด็นต่างๆ ในฟอรัมนี้ แต่ฉันคิดว่าคำถามนี้อยู่นอกเหนือธรรมชาติของฟอรัมนี้ บางทีสิ่งที่คุณต้องการคือการใช้เวลาเรียนรู้ศิลปะของลูปและโครงสร้างอื่นๆ :)

person itsols    schedule 25.05.2013
comment
ปัญหา: มันจะลบทุกค่าใน A[1] จนถึง 6 และเขียนเฉพาะค่า 6 เท่านั้น ส่วนค่าอื่นๆ ว่างเปล่า - person PJ_Boy; 25.05.2013
comment
เป็นแนวคิดที่ดี หากเพียงแต่จะเก็บค่าที่มีอยู่ของ A[1] และค่าที่เหลือไว้ด้วยโดยไม่ลบออก - person PJ_Boy; 25.05.2013
comment
@PJ_Boy อาจเป็นข้อผิดพลาดในรหัสของคุณ คุณช่วยแสดงรหัสใน for loop ที่สองของคุณได้ไหม เพียงวางลงในช่องแสดงความคิดเห็นนี้ - person itsols; 25.05.2013
comment
for(int i = 0; i ‹ 6; ++i) //6 เป็นบรรทัดที่ 6 { getline(file, line); A[i] = เส้น; } A[5] = เส้น; } บัญชี ofstream (accounts.txt); if (Account.is_open()) { for(int j=0;j‹6;j++) บัญชี ‹‹ A[j] ‹‹ \n; //วนรอบอาร์เรย์แล้วเขียนลงไฟล์ Account.close(); } - person PJ_Boy; 25.05.2013
comment
อึมันรบกวนทั้งหมดในความคิดเห็น - person PJ_Boy; 25.05.2013
comment
ตกลง ขั้นตอนแรก เปิดไฟล์ข้อความของคุณโดยใช้โปรแกรมแก้ไขใดๆ และตรวจสอบว่ามีข้อมูลใน 6 บรรทัดแรกจริงหรือไม่ ขั้นตอนที่สอง: ในวงแรกที่เราจัดเก็บข้อความในอาร์เรย์ ไม่นานหลังจากที่เรากำหนดข้อความลงในอาร์เรย์ ให้ส่งออกองค์ประกอบ นี่จะแสดงให้เราเห็นว่ามีข้อมูลอยู่ในนั้นหรือไม่ แล้วแจ้งให้ทราบครับ... - person itsols; 25.05.2013
comment
อีกประการหนึ่ง: อย่าใช้ ++i ในการวนซ้ำ แทนที่จะเปลี่ยนเป็น i++ - person itsols; 25.05.2013
comment
ฉันอัปเดตโค้ดของคุณแล้ว ตรวจสอบและแจ้งให้เราทราบว่าโค้ดที่แสดงถูกต้องหรือไม่ ท่านครับ มันไม่แสดงอะไรเลย - person PJ_Boy; 25.05.2013