Bagaimana cara membaca baris demi baris atau seluruh file teks sekaligus?


86

Saya dalam tutorial yang memperkenalkan file (cara membaca dan menulis dari \ ke file)

Pertama-tama, ini bukan pekerjaan rumah, ini hanya bantuan umum yang saya cari.

Saya tahu cara membaca satu kata dalam satu waktu, tetapi saya tidak tahu cara membaca satu baris dalam satu waktu atau cara membaca seluruh file teks.

Bagaimana jika file saya berisi 1000 kata? Tidak praktis membaca setiap kata.

File teks saya bernama (Baca) berisi yang berikut ini:

Saya suka bermain game Saya suka membaca Saya punya 2 buku

Inilah yang telah saya capai sejauh ini:

#include <iostream>
#include <fstream>

using namespace std;
int main (){

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

  inFile >>

Apakah ada cara yang mungkin untuk membaca seluruh file sekaligus, daripada membaca setiap baris atau setiap kata secara terpisah?




Membaca kata demi kata hanya sedikit lebih lambat dari baris demi baris. Jika Anda benar-benar membutuhkan kata-kata, maka lebih baik membaca kata-kata. Baca baris jika Anda berurusan dengan data berorientasi garis seperti file CSV.

@Arkadiy itu salah. Untuk file 100 MiB, membaca baris demi baris dengan mudah akan memakan waktu beberapa detik, sementara membaca blok 4 KiB dalam hitungan detik kurang dari satu detik.
Vallentin

@Vallentin: Mengingat bahwa semua aliran di-buffer, pembacaan disk yang sebenarnya sudah dilakukan blok demi blok. Selebihnya hanya memanipulasi data di memori.

Jawaban:


163

Anda dapat menggunakan std::getline:

#include <fstream>
#include <string>

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

Perhatikan juga bahwa lebih baik Anda membuat aliran file dengan nama file di konstruktornya daripada membuka secara eksplisit (hal yang sama berlaku untuk penutupan, biarkan destruktor yang melakukan pekerjaan).

Dokumentasi lebih lanjut tentang std::string::getline()dapat dibaca di Referensi CPP .

Mungkin cara termudah untuk membaca seluruh file teks adalah dengan menggabungkan baris yang diambil tersebut.

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
Meskipun tidak jelas, while(getline(f, line)) { ...}sebenarnya cara yang disarankan untuk melakukan ini. Ini dijelaskan di sini: gehrcke.de/2011/06/… --- di sana Anda juga menemukan pendekatan yang berguna untuk penanganan kesalahan yang tepat.
Dr. Jan-Philip Gehrcke

1
Kode di atas tidak dapat dikompilasi tanpa#include <iostream>
Tyguy7

@ Tyguy7 Mengapa #include <iostream>diperlukan? Menurut saya itu <fstream>dan <string>sudah cukup. Jika yang Anda maksud std::getline, itu ada di dalam <string>, bukan di <iostream>.
Fabio mengatakan Reinstate Monica

@FabioTurati Saya tidak yakin, saya baru tahu bahwa setelah saya memasukkannya, semuanya terkompilasi dengan baik.
Tyguy7

19

Saya tahu ini adalah utas yang sangat lama, tetapi saya juga ingin menunjukkan cara lain yang sebenarnya sangat sederhana ... Ini adalah beberapa contoh kode:

#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
Jawaban bagus, saya menggunakan ini dengan stringstream alih-alih cout untuk mendapatkan seluruh file menjadi stringstream raksasa
bjackfly

5

Saya pikir Anda bisa menggunakan fungsi istream .read (). Anda dapat melakukan loop dengan ukuran chunk yang wajar dan membaca langsung ke buffer memori, lalu menambahkannya ke semacam wadah memori arbitrer (seperti std :: vector). Saya dapat menulis sebuah contoh, tetapi saya ragu Anda menginginkan solusi yang lengkap; tolong beri tahu saya jika Anda memerlukan informasi tambahan.


Saya tidak tahu siapa yang memberikan suara negatif untuk jawaban ini tetapi ini bagus mungkin saya bukan dari standar Anda tetapi saya menggunakan hal yang sama
Javasist

4

Nah, untuk melakukan yang satu ini juga bisa menggunakan fungsi freopen yang disediakan di C ++ - http://www.cplusplus.com/reference/cstdio/freopen/ dan membaca file baris demi baris sebagai berikut -:

#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

Metode lain yang belum disebutkan adalah std::vector.

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

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

Kemudian Anda cukup mengulang vektor dan memodifikasi / mengekstrak apa yang Anda butuhkan /


4
Ini vectoradalah langkah yang tidak perlu. Anda bisa mengulangi ifstreampenggunaan std::istream_iterator<std::string>(inFile).
Joseph Mansfield

0

Anda juga dapat menggunakan ini untuk membaca semua baris dalam file satu per satu lalu mencetak 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;
}

Semoga ini bisa membantu Anda :)


0

halo bro ini adalah cara membaca string di baris yang tepat menggunakan kode ini

Semoga ini bisa membantu Anda!

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

Semoga berhasil !

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.