我没有正确使用fseek()吗?

时间:2018-05-19 14:17:58

标签: c binaryfiles fseek

我试图更新二进制文件中的某些信息,但我在尝试向后退到行的开头遇到问题。

void updateSalary(char* filename)
{
    int i = 0;
    employee temp;
    char c;
    float increase;
    FILE *fup = fopen(filename, "rb+");
    if (fup == NULL)
    {
        printf("Unable to read the file\n");
        return;
    }

    fread(&temp, sizeof(employee), 1, fup);
    while (!feof(fup))
    {
    printf("How big is the increase to %s's salary?\n", temp.name);
    scanf("%f", &increase);
    temp.salary += increase;
    fseek(fup, (i * sizeof(employee)), SEEK_SET);
    fwrite(&temp, sizeof(employee), 1, fup);
    fread(&temp, sizeof(employee), 1, fup);
    i++;
    }
fclose(fup);
}

问题是,例如,如果我选择更新2名员工,由于某种原因,while循环不会停在第2名员工并且功能继续......

提前致谢。

编辑: 好像是fwrite();函数没有前进(按位置意义)直到下一行,所以有固定的代码:

void updateSalary(char* filename, float threshold)
{
    int i = 0;
    employee temp;
    char c;
    float increase;
    FILE *fup = fopen(filename, "r+b");
    if (fup == NULL)
    {
        printf("Unable to read the file\n");
        return;
    }
    //fread(&temp, sizeof(employee), 1, fup);
    while (fread(&temp, sizeof(employee), 1, fup))
    {
    printf("How big is the increase to %s's salary?\n", temp.name);
    rewind(stdin);
    scanf("%f", &increase);
    temp.salary += increase;
    fseek(fup, (i * sizeof(employee)), SEEK_SET);
    fwrite(&temp, sizeof(employee), 1, fup);
    **fseek(fup, ((i+1) * sizeof(employee)), SEEK_SET);**
    i++;
    }
fclose(fup);
}

1 个答案:

答案 0 :(得分:1)

您应该查看fopen文档中的细则:

  

在更新模式('+')中,可以执行输入和输出,但是如果没有对fflush,fseek,fsetpos或rewind进行干预调用,则输入后不能输入,并且输入不能在没有干预的情况下输出调用fseek,fsetpos或rewind,除非输入操作遇到文件结尾。

读取和写入可能是缓冲的,但仍然共享一个文件位置。切换模式而不警告运行时(使用fseek)可能会导致缓冲。

所以行

fseek(fup, (i * sizeof(employee)), SEEK_SET);
fwrite(&temp, sizeof(employee), 1, fup);
fread(&temp, sizeof(employee), 1, fup);

在写和读之间需要多一个fseek