【问题标题】:fseek function is not working after fopen(argv[1], "ab")fopen(argv[1], "ab") 之后 fseek 函数不起作用
【发布时间】:2019-11-26 15:58:51
【问题描述】:

当我使用“wb”选项打开文件时,fseek 运行良好。 但是 fopen(argv[1], "ab") 之后 fseek 函数就不能正常工作了。

我的代码有问题吗?

这里是代码。

student.h
struct student {
  int id;
};

main.c
#define START_ID 1201001
struct student rec;
FILE *fp = fopen(argv[1], "rb");
if(fp==NULL) {
    fp=fopen(argv[1], "wb");
} else {
    fclose(fp);
    fp=fopen(argv[1], "ab");
}
fseek(fp, (rec.id-START_ID)*sizeof(sec), SEEK_SET);

【问题讨论】:

    标签: c file fopen fseek


    【解决方案1】:

    问题是当使用"a" 属性打开文件时,fseek不应该工作。见here

    追加:在文件末尾打开文件以进行输出。输出操作 总是在文件末尾写入数据,扩展它。重新定位 操作(fseek、fsetpos、rewind)被忽略。文件已创建 如果它不存在。

    要解决这个问题,请尝试使用"a+" 属性:

    追加/更新:打开一个文件进行更新(输入和输出) 在文件末尾写入数据的所有输出操作。 重新定位操作(fseek、fsetpos、rewind)影响下一个 输入操作,但输出操作将位置移回 文件结尾。如果文件不存在,则创建该文件。

    【讨论】:

      【解决方案2】:

      mode 参数指向一个字符串。 如果字符串是以下之一(如下所述),则应以指示的模式打开文件。否则,行为未定义。

      r 或 rb 打开文件进行读取。

      w 或 wb 截断为零长度或创建文件进行写入。

      a 或 ab 追加;打开或创建文件以在文件末尾写入。

      r+ or rb+ or r+b 打开文件进行更新(读写)。

      w+ 或 wb+ 或 w+b 截断为零长度或创建文件进行更新。

      a+ 或 ab+ 或 a+b 追加;打开或创建文件进行更新,写在 文件结束。

      因此,当您使用标志ab 时,您是在说您希望在文件结束处创建/打开文件以进行写入。因此,出于同样的原因,您将无法使用fseek

      解决方案:

      尝试使用其他标志(如上所述),以便您可以使用fseek

      有关更多信息,请参阅

      http://man7.org/linux/man-pages/man3/fseek.3.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-17
        • 2012-09-22
        • 2019-12-02
        相关资源
        最近更新 更多