从原始文件中阅读每行。 根据需要修改或更换行。 将行写入临时文件。
都读取所有行,删除原始文件并重命名临时文件。
#include <stdio.h>
#include <string.h>
int main ( void) {
char *orgname = "sym.txt";
char *tmpname = "sym.tmp";
char line[4096] = "";
FILE *org = NULL;
FILE *tmp = NULL;
if ( NULL == ( org = fopen ( orgname, "r"))) {
perror ( orgname);
return 1;
}
if ( NULL == ( tmp = fopen ( tmpname, "w"))) {
perror ( tmpname);
fclose ( tmp);
return 1;
}
while ( fgets ( line, sizeof line, org)) {
if ( ! strcmp ( line, "OUTER var 2026\n")) { // found a matching line
fprintf ( tmp, "%s", "OUTER label 2028\n"); // replace the line
}
else {
fprintf ( tmp, "%s", line);
}
}
fclose ( org);
fclose ( tmp);
remove ( orgname);
rename ( tmpname, orgname);
}
如果您打算寻求特定的字节偏移,则应在二进制模式下打开文件。 如果在文本模式下打开(默认值),您将有可移植性问题。
插入可以在现有文件上完成。
打开文件以读写
"rb+"
要保留插入后的文件,请将每个字符移动2(原始部分和新部分的差异)。
插入新部分。
#include <stdio.h>
#include <stdlib.h>
int main ( void) {
char *filename = "sym.txt";
char ch = 0;
long size = 0;
FILE *pf = NULL;
if ( NULL == ( pf = fopen ( filename, "rb+"))) {
perror ( filename);
return 1;
}
fseek ( pf, 0, SEEK_END);
size = ftell ( pf);
// shift remainder of file 2 character to accomodate difference in len
while ( size > 107) { // 98 + 9 (len of original)
--size;
fseek ( pf, size, SEEK_SET);
fread ( &ch, 1, 1, pf);
fseek ( pf, size + 2, SEEK_SET);
fwrite ( &ch, 1, 1, pf);
}
fseek ( pf, 98, SEEK_SET);
fwrite ( " label 2028", 1, 11, pf); // insert
fclose ( pf);
}
N var 2002
ZERO var 2004
COUNT var 2006
SUM var 2008
LOOP label 2008
X var 2010
ONE var 2020
OUTER var 2026// This line should have been changed to "OUTER label 2028"
输出为:
N var 2002
ZERO var 2004
COUNT var 2006
SUM var 2008
LOOP label 2008
X var 2010
ONE var 2020
OUTER label 2028// This line should have been changed to "OUTER label 2028"