在Linux嵌入式端,想通过c库函数,修改一个文本文件,在使用fputs函数写文件时出现了真正写入的文件的位置不对。具体操作流程如下:
- 通过fopen打开已存在的文本;
- 通过fgets读取文本内容并查找相应字符串;
- 当查找到需要修改的字符串时,直接在fgets返回的字符缓冲修改后,通过fputs函数将内容回写文件;
- fclose函数关闭文本操作。
myFile = fopen("xxx", "rb+");
fseek(myFile, 0L, SEEK_SET);
memset(str, 0, 256);
while (fgets(str, 256 , myFile)){
if (!strncmp(key, str, strlen(key))){
/*replace str */
/* ... */
fputs(str, myFile);
}
memset(str, 0, 256);
}
fclose(myFile);
如此操作的时候,会发现,真正写入文件的位置不是你通过fgets函数读取到的位置,这个时候,需要在通过fseek函数,将文件指针位置指向当前读取位置再fgets写入文件,这样才会正常写入。
myFile = fopen("xxx", "rb+");
fseek(myFile, 0L, SEEK_SET);
memset(str, 0, 256);
while (fgets(str, 256 , myFile)){
if (!strncmp(key, str, strlen(key))){
/*replace str */
/* ... */
fseek(myFile, 0, SEEK_CUR);
fputs(str, myFile);
}
memset(str, 0, 256);
}
fclose(myFile);
具体是什么原因导致的也没有去深究,猜测可能是因为一开始fopen文件之后,一直都是读取数据,将会有个文件流缓冲机制,虽然当前fgets函数获取的数据偏移是100,但可能文件指针已经到达数据偏移120的位置,所以需要通过fseek函数将文件指针重新指向当前文本位置再写入。
以上为个人观点,有不同看法可以讨论,学习,谢谢。
经过@嘉木有鱼大神的指点,了解到问题的原因了。很简单,是因为在使用fgets读取文本数据返回的时候,此时文件指针已经指向读取位置的末端了,所以这个时候通过fputs写入数据,自然的就会在读取数据的末端。感谢嘉木有鱼大神的指点。
转载请注明出处!