【问题标题】:Confusion in File Operations Of CC语言文件操作的困惑
【发布时间】:2012-03-30 18:42:24
【问题描述】:

这里我有一个文件名,我想先创建这个文件。 我想在 File 中留下一些字节,而不是写数据。 所以在下面的代码中我使用了fseek(pFile, 10, SEEK_SET)。 比我在这里写的"sam" 文件从第 11 位开始。 然后关闭文件并再次以附加模式打开此文件 4 次并在文件末尾写入“abc"”。 所以example.txt 中的总字节数是25 字节。 所以文件数据是这样的..........samabcabcabcabc。 但我不想在这个文件数据中出现“sam”。意味着我只想要 22 个字节。 如果我在这里 dnt 使用 fputs("sam", pFile); 而不是它只给出 12 个字节,文件数据看起来像 abcabcabcabc

我想在 ..........abcabcabcabc 之类的文件中输出。

在实际程序中,我有一个函数可以在 10 个字节后附加数据。并且这个函数调用了多次,我该如何实现这个目标?

我的示例代码在这里。

#include <stdio.h>

int main() {
    FILE * pFile;
    pFile = fopen("example.txt", "wb");
    fseek(pFile, 10, SEEK_SET);
    fputs("sam", pFile);
    fclose(pFile);
    append("example.txt");
    append("example.txt");
    append("example.txt");
    append("example.txt");
    return 0;
}

void append(char *file) {
    FILE * pFile;
    pFile = fopen("example.txt", "ab");
    fputs("abc", pFile);
    fclose(pFile);
}

【问题讨论】:

  • 您应该检查各种函数的返回值。我不确定在文件末尾之外搜索是否合法/便携。

标签: c file append fopen


【解决方案1】:

来自man fopen

当你打开一个文件进行追加时(即当 Type 参数 设置为 a),则无法覆盖已在 文件。

因此,如果您希望像在 append() 中所做的那样以附加模式打开文件,则不能覆盖 sam

即使在a+ 打开模式下,您也可以重新定位(使用fseekrewind)内部指针指向文件中的任何位置进行读取,但写入操作会将其移回文件末尾。

解决方法是第一次使用r+打开模式,使用fseek重新定位内部指针,然后写入abc。之后您可以像往常一样拨打您的append

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多