2012-08-16 26 views
0

我試圖使用FREAD()讀一個簡單的文本文件(這裏out.wsp),但我得到「 類型'System.AccessViolationException'「未處理的異常」。我在VS2010中遇到了這個錯誤,但是當我在Linux中編譯並運行它時很好。任何想法的代碼有什麼問題?另外,因爲我是C/C++中的新手,是否有任何其他方法可以執行此類操作?類型的未處理的異常「System.AccessViolationException」,而嘗試使用讀取文本文件FREAD

#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; 

} 

感謝,

Fanttazio

+0

標準'fread'不會拋出異常。這是非常標準的C++嗎? http://www.cplusplus.com/reference/clibrary/cstdio/fread/ – 2012-08-16 13:24:37

+0

這看起來像C代碼(除了'using namespace std;'這是毫無意義的)。 – hmjd 2012-08-16 13:29:02

+0

@Kirirl這不是C++。這是使用'namespace std;'的C語言。字符文字在C++中是不變的,所以你得到一個訪問衝突試圖寫入它。 fread不會在這裏拋出異常 - 這是VC++運行時拋出的訪問衝突異常。 – Cubic 2012-08-16 13:29:49

回答

0
rc = fread(wspfile,sizeof(wspfile)-1,1, fp); 

不正確的,因爲wspfile是字符串文本。修改此文字是未定義的行爲。 使用其他緩衝區,或可能是std::string

n3337 2.14.5/12

是否所有字符串文字是不同的(即,被存儲在非重疊的對象)由實現 定義。試圖修改字符串文字的效果是未定義的。

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()閱讀的大小7字節1項目。如果這是成功的,fread()將返回1,因爲它返回讀取的項數,而不是字節數。以下行:

wspfile[rc] = '\0'; 

會有效地將數組截斷爲單個字節。更改sizecount參數的順序以更正此問題。

相關問題