2012-06-14 75 views
3

我正在寫一個結構到文件中,但它返回垃圾。這裏是我的代碼:文件返回垃圾,但正確寫入

ptFile = fopen("funcionarios.dat", "ab+"); 
fwrite(&novoFunc, sizeof(strFunc), 1, ptFile); 

結構novoFunc,在fwrite之前和之後的值不是垃圾。 然而,當我返回文件值:

ptFile = fopen("funcionarios.dat", "rb+"); 
[...] 

fseek(ptFile, i*sizeof(strFunc), SEEK_SET); //on the loop, i goes from 0 to total structs 
fread(&funcionario, sizeof(strFunc), 1, ptFile); 

printf("Code: %d; Name: %s; Address: %s; CPF: %d; Sales: %d\n", funcionario.codigo, funcionario.nome, funcionario.endereco, funcionario.cpf, funcionario.numVendas); 

任何想法,爲什麼?代碼工作正常,我不記得做了有意義的改變。

在此先感謝

編輯:結構定義

typedef struct func{ 

    int codigo; 
    char nome[50]; 
    char endereco[100]; 
    int cpf; 
    int numVendas; 
    int ativo; 


} strFunc; 

EDIT2:它剛剛怪異:它在Linux上工作正常(使用NetBeans和gcc編譯器),但它在Windows犯規(DEVCPP和代碼塊)。好了,整個代碼是在這裏:

http://pastebin.com/XjDzAQCx

功能cadastraFucionario()註冊用戶,當我使用listaFuncionarios(),列出所有登記的數據,則返回垃圾。這裏是什麼listaFuncionarios()返回打印:

http://img715.imageshack.us/img715/3002/asodfadhf.jpg

對不起英語

+3

您應該檢查'fread()'的返回值,看看讀取是否成功。讀取失敗對於看到垃圾很容易。 – FatalError

+0

類型爲'strFunc'的'novoFunc'和'funcionario'? – sarnold

+0

@FatalError fread應該返回什麼?它有時返回1,其他0,但在這兩種情況下,結果都是在一些「結構變量」中產生垃圾,而在其他情況下則是正確的。 編輯:所有的變量都是垃圾,不是幾個 –

回答

1

此:

它可以在Linux很好...但它不上窗戶

是一個很大的紅旗。 Windows具有與「二進制」文件不同的「文本」文件。在Linux和其他Unix上,沒有區別。在源

兩條線站了出來:

fopen("funcionarios.dat", "rb+"); 

後來

fopen("funcionarios.dat", "r+"); 

也就是說,有時你打開「二進制」模式下的文件,有時還會在「文本」模式。如果您打算讀取或寫入非文本數據,請確保始終以「二進制」模式打開任何文件(即模式字符串中的b)。

+0

耶!它的工作現在,謝謝。問題在於你兩個相關的錯誤(我沒有關閉ptFile在片刻,我沒有打開總是與二進制);這種跛腳的錯誤讓我頭痛幾天。謝謝大家! –

2

碼心不是你說:「該代碼是工作的罰款,我不記得做有意義的變化。」

當它工作正常時,它會在您的文件中寫入一些結構。

也許以後它仍然可以正常工作,並且在文件末尾添加了一些附加結構。原始數據仍然保留在文件的開頭。所以當你閱讀文件的開頭時,你就會讀到原始數據。也許。

你確定你讀垃圾嗎?你確定你不只是讀舊數據嗎?

在您的代碼:

ptFile = fopen("funcionarios.dat", "ab+"); 

追加是爲了某種目的而不是爲他人做正確的事。你需要wb +嗎?

+0

我多次刪除了.dat文件,以確保沒有錯誤影響我的讀數。此外,我已經檢查了fwrite函數前後的結構變量值,它們是正確的。 我沒有使用wb +,因爲它會覆蓋文件。 –

1

以下是函數retornaIndice中的兩個問題。

while(!feof(ptFile)){ 
    fseek(ptFile, sizeof(strFunc)*i, SEEK_SET); 
    fread(&tmpFunc, sizeof(strFunc), 1, ptFile); 

您不檢查fread的結果。讀完最後一條記錄後,eof還沒有到達,所以你會嘗試另一次讀取。該讀取將會到達eof並且將返回0,但是您沒有檢查該0,所以您將使用垃圾數據並在下一次while語句測試時退出循環。

if(codigo != 0 && tmpFunc.ativo){     
    if(tmpFunc.codigo == codigo){ 
     return i;        
    } 

如果此時檢測到問題,則不要關閉ptFile。泄漏的句柄不應該導致垃圾數據被寫入文件,但它也不會激發信任。

你的一些其他功能有相同的錯誤。

+0

耶!它的工作現在,謝謝。問題在於你兩個相關的錯誤(我沒有關閉ptFile在片刻,我沒有打開總是與二進制);這種跛腳的錯誤讓我頭痛幾天。謝謝大家! –