读写到位不写?

时间:2013-07-20 13:57:41

标签: c

C的新手,我正在尝试进行文本替换。我认为f +中的r +应该允许我读写。我正在查看文件中的每一行,如果它以/开头,那么我将http://example.com添加到行的开头。示例... line是/ tree,然后该行变为http://example.com/tree。正则表达式工作正常。我可以读文件很好,但它不是写。有什么想法吗?

void
fix_relative (char *page)
{
  FILE *fp;
  fp = fopen ("file", "r+");

  char line[1000];
  regex_t re;
  regcomp (&re, "^/", REG_EXTENDED);

  while (fgets (line, sizeof line, fp) != NULL)
    {
      if (regexec (&re, line, 0, NULL, 0) == 0) {
    fprintf (fp, "http://example.com%s\n", line);
      }
    }

  fclose (fp);
}

3 个答案:

答案 0 :(得分:2)

这可以帮助您理解您的问题

fopen function

目的: 打开一个流。更安全的fopen_s功能也可用。

语法: FILE * fopen(const char * name,const char * mode);

声明:

fopen函数打开名称为name指向的字符串的文件,并将流与其关联。该字符串可能包含完整路径(来自根目录),相对路径(来自当前目录)或仅包含名称。

参数模式指向一个字符串。如果字符串是以下之一,则文件以指示的模式打开。

  • “r”打开文本文件进行阅读。
  • “w”截断为零长度或创建用于写入的文本文件。
  • “a”追加;打开或创建文本文件以便在文件结尾处写入。
  • “rb”打开二进制文件进行读取。
  • “wb”截断为零长度或创建用于写入的二进制文件。
  • “ab”追加;打开或创建二进制文件,以便在文件结尾处写入。
  • “r +”打开文本文件进行更新(读写)。
  • “w +”截断为零长度或创建文本文件以进行更新。
  • “a +”追加;打开或创建文本文件以进行更新,在文件结尾处写入。
  • “rb +”打开二进制文件进行更新(读写)。
  • “wb +”截断为零长度或创建二进制文件以进行更新。
  • “ab +”追加;打开或创建二进制文件以进行更新,在文件结尾处写入。
  • “r + b”与“rb +”相同
  • “w + b”与“wb +”相同
  • “a + b”与“ab +”相同

如果文件不存在或无法读取,则打开具有读取模式的文件('r'作为mode参数中的第一个字符)将失败。

打开带有追加模式的文件('a'作为mode参数中的第一个字符)会导致对文件的所有后续写入强制转换为当前的文件结束,无论是否对fseek函数进行干预调用

当使用更新模式打开文件时('+'作为mode参数中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,如果没有对fflush功能或文件定位功能(fseek,fsetpos或rewind)的干预调用,输出不应直接输入,并且输入不应直接跟随输出而不干预文件定位函数,除非输入操作遇到文件结尾。

当打开时,流被完全缓冲,当且仅可以确定它不参考交互设备。将清除流的错误和文件结束指示符。

返回: 指向成功时控制流的对象的指针,否则为空指针。

答案 1 :(得分:2)

这绝不可能有效。只要原始字符串,只要新字符串完全,您就会遇到问题。此外,由于您在文本模式下工作,因为换行/回车转换可能会有其他假象。

相反,请执行以下操作:

  • 打开文件“file”仅供阅读
  • 创建一个新的临时文件,仅供写入
  • 读取一行,必要时修改,写入新文件
  • 完成后,删除“文件”并重命名临时文件。

答案 2 :(得分:1)

有一点可能不太清楚:如果您更新文件中的行,并且替换文本完全相同的长度,那么您将完成一个完整的散列file:你将覆盖它之后的内容。

所以,如果你有一个包含句子的文件:

   I love programming.
   I love life.

并将文件位置设置为第一句并将“love”替换为“loathe”,您将无法获得

   I loathe programming
   I love life

你会得到

   I loathe programming love life

因为你现在已经覆盖了第一句话中的行分隔符,并从下一句中覆盖了“I”。

如果用较长的字符串替换字符串,则会将文件中的每个其他字符向前推送。要进行替换,您必须将整个文件读入内存,进行替换,然后将文件写回磁盘。