【问题标题】:Unhandled Exception, writing information to a file C language未处理的异常,将信息写入文件 C 语言
【发布时间】:2013-05-13 19:52:17
【问题描述】:

这就是我想要做的,

我有一个包含信息的文件。我正在尝试重写它,所以在每一行之前,都会出现行号。

我的基本想法是这样的:

while i haven't reached the end of the file:
save the first line of the file (100 characters or until null is reached) in str
go back to the file, and write "line number" and then the info in str.
now str takes the next 100 chars...rinse and repeat.

实际代码:

void add_line_number(FILE* f1)
{
    char str[100];
    int i=1;
    fseek(f1,0,SEEK_SET);
    do
    {
        fgets(str,100,f1);
        fprintf(f1,"%d %s",i,str);
        i++;
        f1+=strlen(str);
    }while(strlen(str));
}

收到错误:文章 4.exe 中 0x77e78dc9 处的未处理异常:0xC0000005:访问冲突写入位置 0xfffff204。

【问题讨论】:

    标签: c exception printf unhandled


    【解决方案1】:

    一般来说,您将无法使其正常工作。在行首添加行号,然后将其写回文件,将导致第一行的尾端覆盖第二行的开头。您需要将修改后的行写入单独的文件,然后在完成后覆盖原始文件。或者,将文件的所有行存储在内存中,然后在第二遍中覆盖该文件,但这对于大文件会产生问题。

    【讨论】:

      【解决方案2】:

      我认为问题在于试图通过 strlen(str) 增加 FILE*。不用那个试试看。

      【讨论】:

      • 我试过了。我正在进入一个无限循环,因为 str 总是采用相同的字符串(从 f1 到下一个 \0。因为 f1 是常量,所以 str 也是)
      • 另外,在与 fgets 相同的循环中对同一个 FILE* 执行 fprintf 不是一个好主意。
      【解决方案3】:

      您正在增加 f1。这并不意味着你似乎认为它意味着什么:)

      由于您将数据插入到文件中,因此您需要实际写入另一个文件,或者在内存中完成所有操作并一次性写入文件。另外,你想读到文件的末尾。

      【讨论】:

      • 我不明白。你可以解释吗?为什么我需要另一个文件?为什么增加 f1 是一件坏事?
      • @OriaGruber 你认为增加 f1 意味着什么?
      • 增加 f1 使其指向文件下一行的第一个字符。
      • A FILE* 只是一个句柄 - 不像 char* 那样使用。 FILE* 允许您调用 fgets 和其他 C 运行时函数。如果你增加它,你就会进入你不拥有的记忆。
      • @OriaGruber 我原以为 fgets 调用可以做到这一点。你怎么看?
      猜你喜欢
      • 1970-01-01
      • 2011-08-08
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2022-11-14
      相关资源
      最近更新 更多