0

fread()を使用して単純なテキスト ファイル (ここでは out.wsp) を読み込もうとしていますが、「型 'System.AccessViolationException' の未処理の例外」が発生します。VS2010 Express でこのエラーが発生しますが、Linux でコンパイルして実行すると問題ありません。コードの何が問題なのか分かりますか? また、私は C/C++ が初めてなので、このようなことを行う他の方法はありますか?

#include "stdafx.h"

#include <stdio.h>

using namespace std;

 int main(){


    char*  wspfile    = "out.wsp";
    FILE*  fp = NULL;

    fp = fopen( wspfile , "r");
    if(fp == NULL) {
        printf("Error: can not open file %s\n", wspfile);
        return -1;
    }   
    rc = fread(wspfile,sizeof(wspfile)-1,1, fp);
    wspfile[rc] = '\0';
    fclose(fp);

return 0;

}

ありがとう、

ファンタツィオ

4

2 に答える 2

2

文字列リテラルを変更することは違法です (未定義の動作):

char*  wspfile    = "out.wsp";
...
rc = fread(wspfile,sizeof(wspfile)-1,1, fp); /* sizeof() is a sizeof(char*),
                                                not an array which is probably
                                                what you intended. */

これがアクセス違反の原因になります。

解決するには、次のように変更できます。

char wspfile[] = "out.wsp";

または、char[]ファイルの名前とは異なる変数をコンテンツに使用することをお勧めします。

の署名fread()は次のとおりであることに注意してください。

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

投稿されたコードが配列の場合、サイズのバイトの項目を読み取るwspfileように求めます。これが成功した場合、バイト数ではなく、読み取られたアイテムの数が返されます。次の行:fread()17fread()1

wspfile[rc] = '\0'; 

配列を事実上 1 バイトに切り捨てます。これを修正するには、引数sizeと引数の順序を変更します。count

于 2012-08-16T13:26:08.670 に答える
0
rc = fread(wspfile,sizeof(wspfile)-1,1, fp);

wspfileは文字列リテラルであるため、正しくありません。このリテラルの変更は未定義の動作です。他のバッファを使用するか、std::string.

n3337 2.14.5/12

すべての文字列リテラルが異なる (つまり、重複しないオブジェクトに格納されている) かどうかは、実装によって定義されます。文字列リテラルを変更しようとした場合の影響は未定義です。

于 2012-08-16T13:25:25.033 に答える