2012-05-03 22 views
-1

私はC++で巨大なtxtを読み込もうとしています。それは70メガバイトを持っています。私の目的は、行ごとに部分文字列を作成し、必要な情報だけを含む別の小さなtxtを生成することです。C++から巨大なtxtファイルを読み込みますか?

私はファイルを読むために、以下のコードを手に入れました。小さなファイルでは完璧に動作しますが、70mbのモンスターでは動作しません。

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    ifstream myReadFile; 
    myReadFile.open("C:/Users/Lucas/Documents/apps/COTAHIST_A2010.txt"); 
    char output[100]; 
    if (myReadFile.is_open()) { 
    while (myReadFile.eof()!=1) { 
     myReadFile >> output; 
     cout<<output; 
     cout<<"\n"; 
    } 


    } 
    system("PAUSE"); 
    return 0; 
} 

これは私が取得エラーです:SeparadorDeAcoes.exeで0x50c819bc(msvcp100d.dll)で 未処理の例外:0xc0000005で:アクセス違反読み取り場所0x3a70fcbc。

誰かがCまたはC#で解決策を指摘できれば、それも受け入れられます!

感謝=)

+0

すぐに死ぬのですか?途中まで?ファイルの処理の最後に? –

+0

あなたの入力ループがEOFをテストする方法は[悪い習慣](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)です。 – Blastfurnace

答えて

6

char output[100]バッファは、行の1つの内容を取ることができません。

char[]バッファではなく、文字列送り先を使用するのが理想的です。

編集これは指摘されているように、これは悪い習慣であり、最後の行を2回読むか、空白の最後の行を読み出すことにつながります。ループのより正確な書き込みは次のようになります。

string output; 
while (getline(myReadFile, output)) { 
    cout<<output<<"\n"; 
} 

**編集 - ここでは悪い、邪悪なコードを残す:

あなたの内側のwhileループの迅速な書き換えは次のようになります。

string output; 
while (myReadFile.good()) { 
    getline(myReadFile, output); 
    cout<<output<<"\n"; 
} 
+0

ありがとう、完璧に=) – Lucas

+0

このコードでEOFをテストする方法は[悪い習慣]です(http://stackoverflow.com/questions/4324441/testing-stream-good-or-stream-eofreads -last-line-twice)。 – Blastfurnace

2

私はあなたの問題はあなたのいずれかの行が100文字を超える長さであることだと思います。文字配列のサイズを大きくする必要があります。

0

std::stringは使用していませんが、ヘッダーファイルが含まれています。 を決定してください。 std::stringまたは文字配列を使用します。

また、std::istream::readを使用して、配列のサイズを関数に指定します。 100文字が70MBよりはるかに小さいので、何回も繰り返す必要があります。

は、動的メモリを使用してはるかに大きな配列を割り当てる試してみてください。

const unsigned int array_size = 1024 * 1024 * 1024; 

int main(void) 
{ 
    char * output; 
//... 
    output = new char [array_size]; 
// read into output 
// ... 
// clean up 
    delete [] output; 
    return EXIT_SUCCESS; 
} 

あなたがstd::stringを使用する場合は、文字列の初期サイズを指定することができますので、サイズのパラメータを取るコンストラクタを使用します。

関連する問題