情景描述: 有一个文件,要替换其中的一个字符串为其他字符串(我的情景中,只会出现一次,而且我只需要替换一次,感谢朋友 发量充足的程序员 指出)。使用文件流的方式解决
文件流程:创建文件流,读取文件到内存,清空文件,判断前面是否有内容(有的话),替换字符写入内存,后面的内容写入(有的话),释放空间
当时参考了一论坛的一篇,但已经找不到,知道的话可以和我说下,加上引用
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>
const char* TARGET_FILE = "D:\\data.c";
const char* target_string_val_1 = "#include \"stdio.h\"";
const char* replace_string_val_1 = "#include \"c/stdio.h\"";
int main(void)
{
printf("%s\n", replace_string_val_1);
FILE* fp = NULL;
long i, size = 0L;
char* mem, *tmp;
size_t target_string_len_1;
size_t replace_string_len_1;
target_string_len_1 = strlen(target_string_val_1);
replace_string_len_1 = strlen(replace_string_val_1);
/* 打开文件 */
fp = fopen(TARGET_FILE, "rb");
if (NULL == fp) {
perror("fopen failed");
goto END;
}
/* 获取文件大小 */
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
printf("=== File size is %ld bytes\n", size);
/* 这一部分使用在判断文件大小是否是符合设定值的大小,不符合则结束程序,但是在我的情景中是不需要的的,故这里注释
感谢朋友 发量充足的程序员 指出
int target_string_len_0 = 1024;
if (size < target_string_len_0) {
printf("no match\n");
goto END;
}
*/
/* 读取全部文件到内存 */
mem = (char*)calloc(size, 1);
if (NULL == mem) {
perror("calloc failed");
goto END;
}
fread(mem, 1, size, fp);
tmp = mem;
/* 重开文件用于写 */
fclose(fp);
fp = fopen(TARGET_FILE, "wb");
/* 字符串搜索 1 */
for (i = 0L; i <= size; ++i) {
if (memcmp(mem + i, target_string_val_1, target_string_len_1) == 0) {
printf("== find match at offset target_string_val_1 %d\n", i);
/* 写入开始到目标字符串的内容 */
if (mem + i - tmp) {
printf("==1 write %ld bytes header\n", mem + i - tmp);
fwrite(tmp, 1, mem + i - tmp, fp);
}
//适配串长度
char* buffer = (char*)malloc(replace_string_len_1);
/* 写入替换字符串 */
printf("==1 write replace string\n");
fwrite(replace_string_val_1, 1,replace_string_len_1, fp);
//写入尾部
tmp = mem + i + target_string_len_1;
printf("== update tmp = %s\n", tmp);
i += target_string_len_1 - 1;
printf("=====1 %d\n",i);
break;
}
}
/* 写入尾部(结尾不是目标字符串的情况) */
if (tmp < (mem + size)) {
printf("== write tail %ld bytes\n", mem + size - tmp);
fwrite(tmp, 1, mem + size - tmp, fp);
}
printf("=== Replace END\n");
fclose(fp);
free(mem);
return 0;
//pause
END:
getchar();
return 0;
}
版权声明:本文为c45449210原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。