问题描述:本来想实现一个功能,替换文本中的特定字符串,例如:
name = ricardo
version = 19
替换为
name = Billion.Yu
version = 19
实现思路:定位到文件中的一个位置,在这个位置上调用fputs函数替换文本内容。但是却发现当定位到文件位置后,插入数据时会覆盖之后的文本信息。错误实现如下,可以借鉴:
#include
#include
#include
#include
int main()
{
printf("function is running...\n");
FILE* fp = NULL;
const int LINE_CONTENT_LEN = 256;
char lineContent[LINE_CONTENT_LEN];
int errnum = 0;
bool findingFlag = false;
fp = fopen("./setting.ini", "r+");
if (fp == NULL){
printf("open file failed, errno = %d!!!\n",errno);
return -1;
}
while(0 == feof(fp)){
memset(lineContent, 0, LINE_CONTENT_LEN);
fgets(lineContent, LINE_CONTENT_LEN, fp);
if(';' == lineContent[0] ||'\0' == lineContent[0] ||
'\r' == lineContent[0] ||'\n' == lineContent[0] ){
continue;
}
if(0 == strncmp(lineContent,"Name=" ,strlen("Name="))){
if( 0 == (errnum= fseek(fp,(0-strlen(lineContent)), SEEK_CUR))){
memset(lineContent, 0, LINE_CONTENT_LEN);
sprintf(lineContent, "Name=%s_%s\n ", "Yu", "Ricardo");
errnum = fputs(lineContent, fp);
if(errnum < 0){
printf("fputs error, num = %d!!!\n",errnum);
}else{
printf("fputs success, num = %d!!!\n",errnum);
}
}else{
printf("fseek error, num = %d!!!\n",errnum);
}
findingFlag = true;
break;
}
}
if(!findingFlag){
printf("Can't find Name= string!\n");
}
fflush(fp);
fsync(fileno(fp));
fclose(fp);
return 0;
}
只能是将要插入位置后面的文件内容读到缓冲,然后定位文件偏移量插入数据,在将读出来的写入。因为文件在磁盘上是连续存放的,不可能说直接在中间插入内容而不覆盖原来的,别的语言提供的都是自己按照上述思路写的。
同样的如果想删除文件中的一个字符,也很悲催,需要把删除字符后面的内容保存下来,再将保存下来的信息拼接到删除字符的文件定位处。
简直不敢相信!!!最后只能求助iniparser 这个库,见后续总结。
引申的想写总结一下fputs函数用法。
函数原型:
int fputs ( const char * str, FILE * stream );
头文件:
#include
参数:
str
要写入流的c格式的字符串
stream
一个文件指针指向打开的FILE对象,表示输出流。
返回值:
成功返回一个非负值。
失败则返回为EOF(通常为-1),并设置错误指示码,需要调用ferror. 需要看ferror的用法。
函数说明:
例子: