问题描述 投票:0回答:3

从原始文件中阅读每行。 根据需要修改或更换行。 将行写入临时文件。

都读取所有行,删除原始文件并重命名临时文件。
#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); }

如果您打算寻求特定的字节偏移,则应在二进制模式下打开文件。  如果在文本模式下打开(默认值),您将有可移植性问题。
c compiler-construction systems-programming
3个回答
1
投票
在文本文件中处理寻求的方法是只能fseek到您从以前的FTELL调用中记住的位置。 这改善了将文本文件表示为行记录集合而不是字节流的系统的可移植性。



插入可以在现有文件上完成。 打开文件以读写

"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);
}  

0
投票

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"


0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.