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);
}
答案 0 :(得分:2)
这可以帮助您理解您的问题
fopen function
目的: 打开一个流。更安全的fopen_s功能也可用。
语法: FILE * fopen(const char * name,const char * mode);
声明:
fopen函数打开名称为name指向的字符串的文件,并将流与其关联。该字符串可能包含完整路径(来自根目录),相对路径(来自当前目录)或仅包含名称。
参数模式指向一个字符串。如果字符串是以下之一,则文件以指示的模式打开。
如果文件不存在或无法读取,则打开具有读取模式的文件('r'作为mode参数中的第一个字符)将失败。
打开带有追加模式的文件('a'作为mode参数中的第一个字符)会导致对文件的所有后续写入强制转换为当前的文件结束,无论是否对fseek函数进行干预调用
当使用更新模式打开文件时('+'作为mode参数中的第二个或第三个字符),可以在关联的流上执行输入和输出。但是,如果没有对fflush功能或文件定位功能(fseek,fsetpos或rewind)的干预调用,输出不应直接输入,并且输入不应直接跟随输出而不干预文件定位函数,除非输入操作遇到文件结尾。
当打开时,流被完全缓冲,当且仅可以确定它不参考交互设备。将清除流的错误和文件结束指示符。
返回: 指向成功时控制流的对象的指针,否则为空指针。
答案 1 :(得分:2)
这绝不可能有效。只要原始字符串,只要新字符串完全,您就会遇到问题。此外,由于您在文本模式下工作,因为换行/回车转换可能会有其他假象。
相反,请执行以下操作:
答案 2 :(得分:1)
有一点可能不太清楚:如果您更新文件中的行,并且替换文本与完全相同的长度,那么您将完成一个完整的散列file:你将覆盖它之后的内容。
所以,如果你有一个包含句子的文件:
I love programming.
I love life.
并将文件位置设置为第一句并将“love”替换为“loathe”,您将无法获得
I loathe programming
I love life
你会得到
I loathe programming love life
因为你现在已经覆盖了第一句话中的行分隔符,并从下一句中覆盖了“I”。
如果用较长的字符串替换字符串,则会将文件中的每个其他字符向前推送。要进行替换,您必须将整个文件读入内存,进行替换,然后将文件写回磁盘。