3

我正在将结构写入文件,但它返回垃圾。这是我的代码:

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

struct 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

对不起,代码不是英文的

4

3 回答 3

2

你说:“代码运行良好,我不记得做过重大更改。”

当它工作正常时,它会将一些结构写入您的文件中。

也许稍后它仍然可以正常工作,并且它在文件末尾附加了一些额外的结构。原始数据仍保留在文件的开头。因此,当您读取文件的开头时,您读取的是原始数据。也许。

你确定你读垃圾?您确定您不只是读取旧数据吗?

在您的代码中:

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

附加对于某些目的是正确的,但对于其他目的则不然。你需要 wb+ 吗?

于 2012-06-14T02:56:59.573 回答
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。泄露的句柄不应导致将垃圾数据写入文件,但也不会激发信心。

您的其他一些功能也有相同的错误。

于 2012-06-17T23:45:49.297 回答
1

这:

它在 linux 上运行良好……但在 windows 上却不行

是一个大红旗。Windows 具有不同于“二进制”文件的“文本”文件。在 Linux 和其他 Unix 上,没有区别。

您的源代码中有两行突出:

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

然后

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

That is, sometimes you open the file in "binary" mode, and sometimes in "text" mode. Make sure you always open any file in "binary" mode (that is, with the b in the mode string) if you ever intend to read or write non-text data.

于 2012-06-18T01:02:37.387 回答