行ごとまたはテキストファイル全体を一度に読み取る方法は?


86

私はファイルを紹介するチュートリアルにいます(ファイルからの読み取りとファイルへの書き込みの方法)

まず第一に、これは宿題ではありません。これは私が求めている一般的な助けにすぎません。

一度に1単語ずつ読む方法は知っていますが、一度に1行ずつ読む方法や、テキストファイル全体を読む方法がわかりません。

ファイルに1000語が含まれている場合はどうなりますか?各単語を読むことは実用的ではありません。

(読み取り)という名前のテキストファイルには、次のものが含まれています。

私はゲームをするのが大好きです読書が大好きです私は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


単語ごとの読み取りは、行ごとよりもわずかに遅くなります。実際に単語が必要な場合は、単語を読むことをお勧めします。CSVファイルなどの行指向のデータを扱う場合は、行を読み取ります。

@Arkadiyは正しくありません。100 MiBファイルの場合、1行ずつ読み取るのに数秒かかりますが、4KiBのブロックを1秒未満の時間で読み取ることができます。
vallentin 2016

@Vallentin:ストリームがすべてバッファリングされているとすると、実際のディスク読み取りはすでにブロックごとに実行されています。残りは、メモリ内のデータを操作するだけです。

回答:


161

あなたが使用することができます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 2015年

1
上記のコードは、#include <iostream>
Tyguy7 2015

@ Tyguy7なぜ#include <iostream>必要なのですか?私には<fstream>それ<string>で十分だと思います。つまりstd::getline<string>ではなく、にあり<iostream>ます。
ファビオは2017

@FabioTuratiよくわかりません。一度含めると、すべてが正常にコンパイルされたことを知っています。
Tyguy7 2017年

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
いい答えです。これをcoutの代わりにstringstreamで使用して、ファイル全体を巨大なstringstreamに入れました
bjackfly 2014

5

istream .read()関数を使用できると思います。妥当なチャンクサイズでループし、メモリバッファに直接読み取ってから、それをある種の任意のメモリコンテナ(std :: vectorなど)に追加することができます。例を書くことはできますが、完全な解決策が必要かどうかは疑問です。追加情報が必要な場合はお知らせください。


誰がこの答えに反対票を投じたかはわかりませんが、これは良いことかもしれませんが、私はあなたの基準に合わないかもしれませんが、同じものを使用しています
Javasist 2012年

4

これを行うには、C ++で提供されているfreopen関数(http://www.cplusplus.com/reference/cstdio/freopen/)を使用して、次のようにファイルを1行ずつ読み取ることもできます。

#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)ます。
ジョセフマンスフィールド

0

これを使用して、ファイル内のすべての行を1つずつ読み取り、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.