3

構造体をファイルに書き込んでいますが、ガベージが返されます。これが私のコードです:

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

fwrite の前後の struct novoFunc の値はガベージではありません。ただし、ファイルの値を返すと:

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 と codeblocks) では動作しません。さて、コード全体は次のとおりです。

http://pastebin.com/XjDzAQCx

関数 cadastraFucionario() はユーザーを登録し、listaFuncionarios() を使用してすべての登録済みデータを一覧表示すると、ガベージが返されます。これは listaFuncionarios() が返すもののプリントです:

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

申し訳ありませんが、コードは英語ではありません

4

3 に答える 3

2

「コードは正常に機能していましたが、大幅な変更を行った覚えはありません」とあなたは言います。

正常に動作していたとき、いくつかの構造がファイルに書き込まれました。

おそらく後で問題なく動作し、ファイルの最後に追加の構造が追加されました。元のデータはファイルの先頭に残っています。したがって、ファイルの先頭を読み取ると、元のデータが読み取られます。多分。

本当にゴミを読んでいますか?古いデータを読み取っただけではありませんか?

あなたのコードで:

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

追加は、ある目的では正しいことですが、他の目的ではそうではありません。代わりに wb+ が必要ですか?

于 2012-06-14T02:56:59.573 に答える
1

関数retornaIndiceの2つの問題があります。

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を閉じません。リークされたハンドルによってガベージデータがファイルに書き込まれることはありませんが、自信を刺激することもありません。

他の関数のいくつかにも同じエラーがあります。

于 2012-06-17T23:45:49.297 に答える
1

これ:

Linuxでは問題なく動作します...しかし、Windowsでは動作しません

大きな赤い旗です。Windows には、「バイナリ」ファイルとは異なる「テキスト」ファイルがあります。Linux とその他の Unix では違いはありません。

ソースの 2 行が目立ちます。

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

以降

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

つまり、ファイルを「バイナリ」モードで開くこともあれば、「テキスト」モードで開くこともあります。bテキスト以外のデータを読み書きする場合は、常に「バイナリ」モード (モード文字列に を使用) でファイルを開くようにしてください。

于 2012-06-18T01:02:37.387 に答える