จะอ่านทีละบรรทัดหรือไฟล์ข้อความทั้งหมดพร้อมกันได้อย่างไร?


86

ฉันอยู่ในบทช่วยสอนที่แนะนำไฟล์ (วิธีอ่านและเขียนจาก \ ถึงไฟล์)

ก่อนอื่นนี่ไม่ใช่การบ้านนี่เป็นเพียงความช่วยเหลือทั่วไปที่ฉันกำลังมองหา

ฉันรู้วิธีอ่านทีละคำ แต่ไม่รู้วิธีอ่านทีละบรรทัดหรืออ่านไฟล์ข้อความทั้งหมดอย่างไร

จะเกิดอะไรขึ้นถ้าไฟล์ของฉันมี 1,000 คำ? ไม่สามารถอ่านแต่ละคำได้

ไฟล์ข้อความของฉันชื่อ (อ่าน) มีดังต่อไปนี้:

ฉันชอบเล่นเกมฉันชอบอ่านหนังสือฉันมีหนังสือ 2 เล่ม

นี่คือสิ่งที่ฉันทำสำเร็จแล้ว:

#include <iostream>
#include <fstream>

using namespace std;
int main (){

  ifstream inFile;
  inFile.open("Read.txt");

  inFile >>

มีวิธีใดบ้างที่เป็นไปได้ในการอ่านทั้งไฟล์พร้อมกันแทนที่จะอ่านแต่ละบรรทัดหรือแยกแต่ละคำ


4
มีคำตอบที่ชัดเจนอยู่ที่นี่: stackoverflow.com/questions/551082/c-read-lines-from-file
sampson-chen

อาจซ้ำกันได้ของHow to read a line from a text file in c / c ++?
Adrian McCarthy

การอ่านทีละคำจะช้ากว่าทีละบรรทัดเพียงเล็กน้อยเท่านั้น หากคุณต้องการคำจริงก็ควรอ่านคำศัพท์ อ่านบรรทัดหากคุณกำลังจัดการกับข้อมูลเชิงเส้นเช่นไฟล์ CSV

@Arkadiy ที่ไม่ถูกต้อง. สำหรับไฟล์ 100 MiB การอ่านทีละบรรทัดจะใช้เวลาไม่กี่วินาทีในขณะที่อ่านบล็อก 4 KiB ในเวลาวินาทีน้อยกว่าหนึ่งวินาที
vallentin

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

คำตอบ:


163

คุณสามารถใช้std::getline:

#include <fstream>
#include <string>

int main() 
{ 
    std::ifstream file("Read.txt");
    std::string str; 
    while (std::getline(file, str))
    {
        // Process str
    }
}

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

เอกสารเพิ่มเติมstd::string::getline()สามารถอ่านได้ที่CPP อ้างอิง

อาจเป็นวิธีที่ง่ายที่สุดในการอ่านไฟล์ข้อความทั้งหมดคือการเชื่อมต่อบรรทัดที่ดึงข้อมูลเหล่านั้นเข้าด้วยกัน

std::ifstream file("Read.txt");
std::string str;
std::string file_contents;
while (std::getline(file, str))
{
  file_contents += str;
  file_contents.push_back('\n');
}  

9
แม้ว่าจะไม่ชัดเจน แต่while(getline(f, line)) { ...}เป็นวิธีที่แนะนำในการทำเช่นนี้ มีคำอธิบายที่นี่: gehrcke.de/2011/06/… --- นอกจากนี้คุณยังพบแนวทางที่เป็นประโยชน์สำหรับการจัดการข้อผิดพลาดที่เหมาะสม
Dr. Jan-Philip Gehrcke

1
โค้ดข้างต้นจะไม่คอมไพล์หากไม่มี#include <iostream>
Tyguy7

@ Tyguy7 ทำไมจะ#include <iostream>ต้อง? สำหรับฉันดูเหมือนว่า<fstream>และ<string>เพียงพอแล้ว ถ้าคุณหมายถึงstd::getlineมันอยู่ในไม่ได้อยู่ใน<string> <iostream>
Fabio กล่าวว่า Reinstate Monica

@FabioTurati ฉันไม่แน่ใจฉันเพิ่งรู้ว่าเมื่อฉันรวมมันแล้วทุกอย่างก็เรียบร้อยดี
Tyguy7

19

ฉันรู้ว่านี่เป็นกระทู้เก่าจริงๆ แต่ฉันอยากจะชี้ให้เห็นอีกวิธีหนึ่งที่ง่ายมาก ... นี่คือโค้ดตัวอย่าง:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {

    ifstream file("filename.txt");
    string content;

    while(file >> content) {
        cout << content << ' ';
    }
    return 0;
}

2
คำตอบที่ดีฉันใช้สิ่งนี้กับ
สตริงสตรีม

5

ฉันคิดว่าคุณสามารถใช้ฟังก์ชัน istream .read () ได้ คุณสามารถวนซ้ำด้วยขนาดก้อนที่เหมาะสมและอ่านโดยตรงไปยังบัฟเฟอร์หน่วยความจำจากนั้นต่อท้ายเข้ากับคอนเทนเนอร์หน่วยความจำบางประเภท (เช่น std :: vector) ฉันสามารถเขียนตัวอย่างได้ แต่ฉันสงสัยว่าคุณต้องการโซลูชันที่สมบูรณ์ โปรดแจ้งให้เราทราบหากคุณต้องการข้อมูลเพิ่มเติม


ฉันไม่รู้ว่าใครลงคะแนนคำตอบนี้ แต่สิ่งนี้ดีอาจเป็นเพราะฉันไม่ได้มาตรฐานของคุณ แต่ฉันใช้สิ่งเดียวกัน
Javasist

4

ในการทำสิ่งนี้ยังสามารถใช้ฟังก์ชัน freopen ที่ให้ไว้ใน C ++ - http://www.cplusplus.com/reference/cstdio/freopen/และอ่านไฟล์ทีละบรรทัดดังนี้ -:

#include<cstdio>
#include<iostream>

using namespace std;

int main(){
   freopen("path to file", "rb", stdin);
   string line;
   while(getline(cin, line))
       cout << line << endl;
   return 0;
}

1

อีกวิธีหนึ่งที่ยังไม่ได้กล่าวถึงคือstd::vector.

std::vector<std::string> line;

while(file >> mystr)
{
   line.push_back(mystr);
}

จากนั้นคุณสามารถทำซ้ำบนเวกเตอร์และแก้ไข / แยกสิ่งที่คุณต้องการ /


4
vectorเป็นขั้นตอนที่ไม่จำเป็น คุณสามารถย้ำกว่าการใช้ifstream std::istream_iterator<std::string>(inFile)
Joseph Mansfield

0

คุณยังสามารถใช้สิ่งนี้เพื่ออ่านบรรทัดทั้งหมดในไฟล์ทีละบรรทัดจากนั้นพิมพ์ i

#include <iostream>
#include <fstream>

using namespace std;



bool check_file_is_empty ( ifstream& file){
    return file.peek() == EOF ;
}

int main (){


    string text[256];
    int lineno ;
    ifstream file("text.txt");
    int num = 0;

    while (!check_file_is_empty(file))
    {    
        getline(file , text[num]);
        num++;
    }
    for (int i = 0; i < num ; i++)
    {
        cout << "\nthis is the text in " <<  "line " << i+1 << " :: " << text[i] << endl ;


    }
    
    system("pause");

    return 0;
}

หวังว่านี่จะช่วยคุณได้ :)


0

สวัสดีครับนี่เป็นวิธีอ่านสตริงในบรรทัดที่แน่นอนโดยใช้รหัสนี้

หวังว่านี่จะช่วยคุณได้!

#include <iostream>
#include <fstream>

using namespace std;


int main (){


    string text[1];
    int lineno ;
    ifstream file("text.txt");
    cout << "tell me which line of the file you want : " ;
    cin >> lineno ; 



    for (int i = 0; i < lineno ; i++)
    {
        
        getline(file , text[0]);

    }   

    cout << "\nthis is the text in which line you want befor  :: " << text[0] << endl ;
    system("pause");

    return 0;
}

โชคดี !

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.