2010-07-02 53 views
0

當讀取二進制文件時,我有一個非常奇怪的問題。在C++中奇怪的文件讀取問題:fread()

void metaDataProcess(FILE *f){ 

    unsigned __int32 obLength; 
    unsigned __int32 numProp; 
    char* objPath; 
    unsigned __int32 rawDataIndex; 
    int level; 
    fread(&obLength,sizeof(obLength),1,f); 
    objPath=new char[obLength]; 
    cout<<"i am at"<<ftell(f)<<endl; 
    fread(&objPath,sizeof(char),obLength,f); 
    objPath[obLength]='\0'; 
    cout<<"i am at"<<ftell(f)<<" the object path is "<<objPath<<endl; 
level=getOrCreateNode(objPath); 

fread(&rawDataIndex,sizeof(rawDataIndex),1,f); 

「objPath」沒有得到預期的位置。 在010編輯器中,對於那個位置它是'/',但是我把它看作'>'。這很奇怪,因爲從ftell的打印輸出值來看,它是正確的位置,並且前後讀取的值得到期望值(obLength = 1;下一個值rawDataIndex == 4294967295)。

當我顯示'/'時,我怎麼會'''。我試過fread(& objPath,sizeof(unsigned char),obLength,f); fread(& objPath,1,obLength,f); 他們都是'>'; 任何人都可以幫助我嗎? 感謝

+0

有什麼特別的原因,你不使用'ifstream'?這不是非常C++ - y – Cogwheel 2010-07-02 18:21:46

+1

選擇一種語言來標記您的問題,C或C++。你會得到更好的答案。 – 2010-07-02 18:31:50

+0

因爲,稍後我會爲此文件進行實時流式傳輸。我不確定文件流是否可以正常工作。 – Grey 2010-07-02 18:33:14

回答

1
objPath=new char[obLength + 1]; 
cout<<"i am at"<<ftell(f)<<endl; 
fread(objPath,sizeof(char),obLength,f); 
objPath[obLength]='\0'; 
+0

我試過了。不工作 – Grey 2010-07-02 18:30:19

+0

@Grey代碼是正確的。如果它不起作用,你的輸入是錯誤的。你當然應該測試fread()等是否成功。 – 2010-07-02 18:31:28

+0

我發現了這個問題。這是一個錯字 fread(&objPath,sizeof(char),obLength,f); => fread(objPath,sizeof(char),obLength,f); 謝謝你們 – Grey 2010-07-02 19:26:59

1

我看不出什麼毛病上面的代碼,除非你是一個acessing內存ilegal位置,因爲你分配:

objPath=new char[obLength]; 

然後執行:

objPath[obLength]='\0'; 

您應該分配new char[obLength+1]爲'\ 0'預留足夠的空間。

另一件事是你在讀取文件後打印ftell的結果。那是你真正想要的嗎?

+0

我把它改爲obLength + 1後,我發佈這個。但它不起作用。我在閱讀之前和之後打印兩篇文章,以瞭解是否閱讀了正確的長度。它顯示十進制的36和37。這是正確的位置。這很奇怪,爲什麼它只是沒有給我正確的字符串。我在C中有相同的代碼,它對我來說工作正常。當我在visual stduio 2010 vC++中使用這段代碼時。它只是沒有給我正確的東西... – Grey 2010-07-02 18:39:50

+0

@Grey你的意思是這不適用於海灣合作委員會,但適用於VC + +?或者你的意思是,如果你把它放在一個.c文件中,而不是一個。它的工作原理是什麼? – Gianni 2010-07-02 18:49:01

0

您的010編輯器是以十六進制而不是十進制顯示位置嗎?您以編程方式以十進制打印它,以便可以解釋您所看到的差異。

編輯:你的文件是什麼樣的? <是您期望的/的一個字符嗎?您是否嘗試過每次閱讀一個字符,並找出/實際存在的偏移量?

+0

它可以顯示十六進制和十進制。在閱讀之前顯示36,閱讀後顯示37,這是我想要的正確長度。然而,它只是給我''''/ – Grey 2010-07-02 18:35:06