Làm thế nào để đọc từng dòng hoặc toàn bộ tệp văn bản cùng một lúc?


86

Tôi đang tham gia một bài hướng dẫn giới thiệu tệp (cách đọc và ghi từ \ vào tệp)

Trước hết, đây không phải là bài tập về nhà, đây chỉ là trợ giúp chung mà tôi đang tìm kiếm.

Tôi biết cách đọc từng từ một, nhưng tôi không biết cách đọc từng dòng một hay cách đọc toàn bộ tệp văn bản.

Điều gì sẽ xảy ra nếu tệp của tôi chứa 1000 từ? Nó không thực tế để đọc từng từ.

Tệp văn bản của tôi có tên (Đọc) chứa thông tin sau:

Tôi thích chơi trò chơi Tôi thích đọc sách Tôi có 2 cuốn sách

Đây là những gì tôi đã đạt được cho đến nay:

#include <iostream>
#include <fstream>

using namespace std;
int main (){

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

  inFile >>

Có cách nào có thể để đọc toàn bộ tệp cùng một lúc, thay vì đọc từng dòng hoặc từng từ riêng biệt không?


4
Có những câu trả lời được xác định rõ ràng ở đây: stackoverflow.com/questions/551082/c-read-lines-from-file
sampson-chen


Đọc từng từ chỉ chậm hơn một chút so với từng dòng một. Nếu bạn thực sự cần từ, thì tốt hơn là đọc từ. Đọc các dòng nếu bạn đang xử lý dữ liệu hướng dòng, chẳng hạn như tệp CSV.

@Arkadiy không chính xác. Đối với tệp 100 MiB, việc đọc từng dòng sẽ dễ dàng mất vài giây, trong khi đọc một khối 4 KiB tại một thời điểm ít hơn một giây.
vallentin,

@Vallentin: Cho rằng tất cả các luồng đều được đệm, việc đọc đĩa thực tế đã được thực hiện từng khối một. Việc còn lại chỉ là thao tác với dữ liệu trong bộ nhớ.

Câu trả lời:


161

Bạn có thể sử dụng std::getline:

#include <fstream>
#include <string>

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

Cũng lưu ý rằng tốt hơn hết bạn chỉ nên xây dựng luồng tệp với các tên tệp trong hàm tạo của nó thay vì mở rõ ràng (tương tự với việc đóng, chỉ cần để hàm hủy thực hiện công việc).

std::string::getline()Có thể đọc thêm tài liệu về CPP Reference .

Có lẽ cách dễ nhất để đọc toàn bộ tệp văn bản là chỉ nối các dòng đã truy xuất đó.

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
Mặc dù không rõ ràng, while(getline(f, line)) { ...}thực sự là cách được khuyến khích để làm điều này. Điều này được giải thích ở đây: gehrcke.de/2011/06/… --- ở đó bạn cũng tìm thấy các phương pháp hữu ích để xử lý lỗi thích hợp.
Tiến sĩ Jan-Philip Gehrcke

1
Đoạn mã trên sẽ không biên dịch mà không#include <iostream>
Tyguy7

@ Tyguy7 Tại sao lại #include <iostream>được yêu cầu? Với tôi dường như vậy <fstream><string>là đủ. Nếu bạn có nghĩa là std::getline, nó ở trong <string>, không ở trong <iostream>.
Fabio nói Hãy phục hồi Monica vào

@FabioTurati Tôi không chắc, tôi chỉ biết rằng một khi tôi đưa vào, mọi thứ được biên dịch tốt.
Tyguy7

19

Tôi biết đây là một chủ đề thực sự cũ nhưng tôi cũng muốn chỉ ra một cách khác thực sự rất đơn giản ... Đây là một số mã mẫu:

#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
Nice câu trả lời, tôi đã sử dụng điều này với một stringstream thay vì cout để có được toàn bộ tập tin vào một stringstream khổng lồ
bjackfly

5

Tôi nghĩ bạn có thể sử dụng hàm istream .read (). Bạn chỉ có thể lặp lại với kích thước chunk hợp lý và đọc trực tiếp vào bộ đệm bộ nhớ, sau đó nối nó vào một số loại vùng chứa bộ nhớ tùy ý (chẳng hạn như std :: vector). Tôi có thể viết một ví dụ, nhưng tôi nghi ngờ bạn muốn có một giải pháp hoàn chỉnh; Vui lòng cho tôi biết nếu bạn cần thêm thông tin.


Tôi không biết ai downvoted câu trả lời này nhưng điều này là tốt có thể tôi không tiêu chuẩn của bạn, nhưng tôi sử dụng điều tương tự
Javasist

4

Để làm điều này, người ta cũng có thể sử dụng hàm freopen được cung cấp trong C ++ - http://www.cplusplus.com/reference/cstdio/freopen/ và đọc từng dòng tệp như sau -:

#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

Một phương pháp khác vẫn chưa được đề cập là std::vector.

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

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

Sau đó, bạn có thể chỉ cần lặp lại vector và sửa đổi / trích xuất những gì bạn cần /


4
Đây vectorlà một bước không cần thiết. Bạn có thể lặp lại việc ifstreamsử dụng std::istream_iterator<std::string>(inFile).
Joseph Mansfield

0

bạn cũng có thể sử dụng điều này để đọc tất cả các dòng trong tệp một rồi in ra

#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;
}

Hy vọng điều này có thể giúp bạn :)


0

xin chào người anh em, đây là một cách để đọc chuỗi theo dòng chính xác bằng cách sử dụng mã này

Hy vọng điều này có thể giúp bạn !

#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;
}

Chúc may mắn !

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.