読書

2012-01-13 3 views
0
int fread(char cc[],int a[],int q) 
    { 
     ifstream infile; 
     infile.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt",ios::binary); 
     infile.read(cc,257); 
     infile.close(); 

     for(int i=0;i<256;i++){a[i]=(unsigned char)cc[i];} 
     return 0; 
    } 

今すぐqはスレッドカウンタから値を取得し、ここでは、私が何をしたいのか読書

あり、それは最初の256個の文字を読み取り、 場合qは1で、位置は256から512などの文字を読み込みます。

これは正しい方法ですか、ccですか、それとも256の配列ですか、それとももっと効率的なやり方ですか?

 int fread(char cc[],int a[],int q) 
     { 
      int ka=0,kb=0; 
      kb=q*256; 
      ka=ka+256; 
      ifstream infile; 
      infile.open("C:\\Dev-Cpp\\DCS\\Decom\\a.txt",ios::binary); 
      infile.seekg(256); 
      infile.read(cc,ka); 
      infile.close(); 

      for(int i=0;i<256;i++){a[i]=(unsigned char)cc[i];} 
      return 0; 
     } 

私はs949.exeに0xb9fb2475で未処理の例外を取得しています:0xc0000005では:アクセス違反が場所0xb9fb2475を読んで、私はVCでそれをデバッグするとき++ 2010

+0

なぜ257文字が読み込まれますが、 'for'ループで256文字だけが処理されるのですか? (ファーストリード機能参照)。 –

+0

私はあなたがそれをやっているどこかで読む、257読み込み256文字 –

+0

私はいつも256バイトを読むために256を使用しています。ファイルに256文字が含まれている場合、プログラムはファイルの終わりを過ぎて読み取ったり、次のデータブロックに読み込んだりすると予期せぬ動作になりません。 –

答えて

1

freadのあなたの第二のバージョンは近くにあります。 私が特定したいくつかの問題があります。
1.タイトルはfreadです。これは一般的なCおよびC++ライブラリ関数です。 freadが呼び出されたときに問題が発生する可能性があります(使用するバージョンは?)。
2.配列を渡すときは、配列の容量も渡す必要があります。
3.配列をソースとして渡すときは、constと宣言します。
4.配列をターゲット/ターゲットとして渡すときは、参照渡しします。
5.アレイを使用しないでください。std::vectorはもっと安全です。
6.入力ファイルの位置を決めるときは、定数256ではなく値を使用します。
7.位置を決定するときにレコードのサイズを含めます。整数を読んでいる場合は、sizeof(int)を掛けます。
8.なぜローカルバッファに読み込んだ後、クライアントのバッファに直接読み込むことができるときに、そのクライアントのバッファにコピーするのですか?
9.データをコピーするときにstd :: copyなどのライブラリルーチンを使用することを推奨します。

+0

"タイトルは' fread'ですか?それは私のようには見えません。それがこれだったら、それは忍者編集の猶予期間の間だけで、あなたが答える約30分前です。 –

+0

また、あなたの提案のいくつかは相互に排他的です。配列参照がその境界を知っており、渡される容量を必要としないので、「配列の容量も渡すべきです」と「配列を渡すときは参照渡し」は互換性がありません。 –

+0

ソースバッファはありません。ローカルバッファはありません。異なるタイプの2つの結果バッファがあります。 'int'バッファに直接読み込むと、動作が大きく変わります(今は各バイトが別の要素になります)。レコードのサイズ( 'sizeof cc [i]')は1であることが保証されており、乗算の必要はありません。 –