Tek seferde satır satır veya tam bir metin dosyası nasıl okunur?


86

Dosyaları tanıtan bir öğreticinin içindeyim (\ 'den dosyaya nasıl okunur ve yazılır)

Her şeyden önce, bu bir ev ödevi değil, bu sadece aradığım genel bir yardım.

Her seferinde bir kelimeyi nasıl okuyacağımı biliyorum, ancak her seferinde bir satırı veya tüm metin dosyasını nasıl okuyacağımı bilmiyorum.

Ya dosyam 1000 kelime içeriyorsa? Her kelimeyi okumak pratik değildir.

(Oku) adlı metin dosyam şunları içerir:

Oyunları oynamayı seviyorum okumayı seviyorum 2 kitabım var

Şimdiye kadar başardığım şey bu:

#include <iostream>
#include <fstream>

using namespace std;
int main (){

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

  inFile >>

Her satırı veya her kelimeyi ayrı ayrı okumak yerine tüm dosyayı bir kerede okumanın mümkün bir yolu var mı?




Kelime kelime okumak, satır satır okumaktan yalnızca marjinal olarak daha yavaştır. Kelimelere gerçekten ihtiyacınız varsa, kelimeleri okumak daha iyidir. CSV dosyası gibi satıra dayalı verilerle uğraşıyorsanız satırları okuyun.

@Arkadiy bu yanlış. Bir 100 MiB dosyası için, bir saniyeden daha kısa bir sürede 4 KiB'lik bir bloğu okurken, satır satır okumak kolayca saniyeler alır.
vallentin

@Vallentin: Akışların hepsinin arabelleğe alındığı göz önüne alındığında, gerçek disk okuması zaten blok blok yapılır. Gerisi sadece bellekteki verileri manipüle etmektir.

Yanıtlar:


163

Şunları kullanabilirsiniz std::getline:

#include <fstream>
#include <string>

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

Ayrıca, dosya akışını açık bir şekilde açmaktansa kurucusundaki dosya isimleriyle oluşturmanız daha iyi olacaktır (aynı şey kapatma için de geçerlidir, bırakın işi yıkıcı yapsın).

Bununla ilgili daha fazla dokümantasyon CPP Referansı'ndastd::string::getline() okunabilir .

Muhtemelen tüm bir metin dosyasını okumanın en kolay yolu, alınan satırları birleştirmektir.

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
Açık olmasa da, while(getline(f, line)) { ...}gerçekten bunu yapmanın önerilen yoludur. Bu, burada açıklanmıştır: gehrcke.de/2011/06/… --- burada ayrıca doğru hata işleme için yararlı yaklaşımlar da bulabilirsiniz.
Dr.Jan-Philip Gehrcke

1
Yukarıdaki kod olmadan derlenmeyecektir#include <iostream>
Tyguy7

@ Tyguy7 Neden #include <iostream>gerekli olmalı? Bana öyle geliyor <fstream>ve <string>yeterli. Demek istiyorsan std::getline, içeride <string>değil <iostream>.
Fabio "Reinstate Monica" diyor

@FabioTurati Emin değilim, sadece bir kez dahil ettiğimde her şeyin iyi derlendiğini biliyorum.
Tyguy7

19

Bunun gerçekten çok eski bir konu olduğunu biliyorum ama aslında gerçekten basit olan başka bir yolu da belirtmek isterim ... Bu bazı örnek kodlar:

#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
Güzel cevap, tüm dosyayı dev bir
dizgi akışına

5

Sanırım istream .read () işlevini kullanabilirsiniz. Makul yığın boyutuyla döngü yapabilir ve doğrudan bellek tamponuna okuyabilir, ardından bunu bir tür rastgele bellek kabına (std :: vektör gibi) ekleyebilirsiniz. Bir örnek yazabilirim, ancak tam bir çözüm istediğinizden şüpheliyim; herhangi bir ek bilgiye ihtiyacınız olursa lütfen bana bildirin.


Bu yanıta kimin olumsuz oy verdiğini bilmiyorum ama bu iyi olabilir, belki sizin standartlarınıza
uymuyorum

4

Bunu yapmak için ayrıca C ++ - http://www.cplusplus.com/reference/cstdio/freopen/'da sağlanan freopen işlevini de kullanabilir ve dosyayı aşağıdaki gibi satır satır okuyabilirsiniz -:

#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

Henüz bahsedilmeyen bir başka yöntem de std::vector.

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

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

Ardından vektör üzerinde yineleyebilir ve ihtiyacınız olanı değiştirebilir / çıkartabilirsiniz /


4
vectorGereksiz bir adımdır. Sen tekrarlayabilirsiniz ifstreamkullanarak std::istream_iterator<std::string>(inFile).
Joseph Mansfield

0

bunu dosyadaki tüm satırları tek tek okumak için de kullanabilir ve ardından 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;
}

umarım bu sana yardımcı olabilir :)


0

merhaba kardeşim bu, bu kodu kullanarak dizeyi tam satırda okumanın bir yoludur

umarım bu size yardımcı olabilir!

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

İyi şanslar !

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.