0

ファイルからの読み取り中に問題が発生しました。以下のコードは、100 ループのように実行時エラーで終了します。 デバッグ後、最後に前のメッセージがまだ表示されるため、トレースでmybuffmy が ( ) で再初期化されていないことがわかりました。同じ問題があるため、mybuff = new char [1024];入力しようとすると問題が発生します。sendbuffこのステップで「アクセス違反の読み取り場所」に関するエラーが発生します ( sprintf(sendbuff,mybuff ))

この問題を解決する方法はありますか?

char sendbuff[1024];
char * mybuff = new char[];
While(....){
    mybuff = new char [1024];
    myfile.read(mybuff ,bufsize);
    sprintf(sendbuff,mybuff );
    ibytessent=0;    
    tmpCount = strlen(sendbuff);
    ibufferlen = strlen(sendbuff);
    ibytessent = send(s,sendbuff,ibufferlen,0);
delete [] mybuff ;
}
4

2 に答える 2

0

ifstream::read()呼び方が悪いと思います。read()は最後にヌル文字を追加しないため、 と を確認する必要がありeofbitますfailbit

説明書より引用、

この関数によって正常に読み取られて格納された文字数は、メンバー gcount を呼び出すことによってアクセスできます。

于 2013-10-09T01:55:51.220 に答える
0

上記のように read() 関数に関する理由で実行時エラーが発生することも考えられます。また、反復ごとに 1024 バイトのスペースを新しくする必要はないと思います。バッファを再利用してみませんか ?

ところで、私はあなたの問題を再現しようとしていますが、以下のコードがあなたのものと同じかどうかはわかりません.実行時エラーは発生しません.

#include <cstdio>
#include <fstream>
using namespace std;
int bufsize = 1024;
int main(){
    char sendbuff[1024];
    char * mybuff = new char[];
    std::ifstream ifs;
    ifs.open ("test.txt", std::ifstream::in);
    while(1){
        mybuff = new char [1024];
        ifs.read(mybuff ,bufsize);
        sprintf(sendbuff,mybuff );
        int ibytessent=0;    
        int tmpCount = strlen(sendbuff);
        int ibufferlen = strlen(sendbuff);
        //ibytessent = send(s,sendbuff,ibufferlen,0);
        delete [] mybuff ;
    }
    return 0;
}
于 2013-10-09T02:00:26.510 に答える