-1

C ++を介して巨大なtxtを読み込もうとしています。70MBあります。私の目的は、行ごとに部分文字列を作成し、必要な情報のみを含む別の小さな 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# で解決策を示すことができれば、それも受け入れられます。

ありがとう =)

4

3 に答える 3

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";
}
于 2012-05-03T17:12:58.850 に答える
2

あなたの問題は、あなたの行の1つが100文字を超えていることだと思います. 文字配列のサイズを大きくする必要があります。

于 2012-05-03T17:12:31.023 に答える
0

を使用していませstd::stringんが、ヘッダー ファイルをインクルードしています。決めます。std::stringまたは文字配列を使用します。

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

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

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は、サイズ パラメータを受け取るコンストラクタを使用して、文字列の初期サイズを指定できるようにします。

于 2012-05-03T17:18:51.300 に答える