将文本插入到txt文件中

时间:2017-10-11 15:07:42

标签: c

我试图完成以下任务:

我有一个带有最后一个可打印字符的文本文件"]"在一个单独的行。
该行不必是文件的最后一行。可以有一些空白行(换行符)。

该项目的目的是在"]"。行之前插入新文本 我尝试实现这一点的方法是从文件末尾搜索文件,找到带有字符"]"的行号。 (char_line)。 从原始文件rules1.txt逐行复制到rules2.txt到char_line行。下一步是使用"]"附加新文本。在末尾。 之后,我可以删除原始文件,并将rules2.txt中的新文件重命名为rules1.txt。

问题我有的是程序找到带有字符"]"的行。我可以做一个printf并查看正确的行号。 我正在分配char_line ="%d"。 当我使用if(i< char_line)时,文件一直被复制到EOF。 如果我指定一个数值,char_line = 23,文件将被复制到第22行,这就是我想要的。 这是代码的一部分,它应该找到"]"的行号,逐行复制rule2.txt到rules2.txt,用"]"。

#include <stdio.h>


int main(void) {
    int end, loop, line;
    char str[64];

    FILE *file; 
    FILE *write;
    int char_line;
    int ret;


    file = fopen("rules1.txt", "r");
    if (file == NULL) {
        printf("Failed to open file\n");
        return -1;
    }
    int ch, line_num = 0;

    do {
        ch = fgetc(file);
        if(ch == '\n')
        line_num++;
    } while (ch != EOF);

    // last line doesn't end with a new line!
    // but there has to be a line at least before the last line
    if(ch != '\n' && line_num != 0) 
        line_num++;

    fclose(file); 
    line = line_num-1;

start:

    file = fopen("rules1.txt", "r");
    if (file == NULL) {
        printf("Failed to open file\n");
        return -1;
    }


    for(end = loop = 0;loop<line;++loop){
        if(0==fgets(str, sizeof(str), file)){//include '\n'
            end = 1;//can't input (EOF)
            break;
        }
    }

    if(!end)
        if (strncmp ("]", str, 1) == 0){ 
            char_line ="%d";
            goto next;
        } else if(line >1){
            line == line--;//WTF?
            fclose(file);
            goto start;
        } else //What to do here?

next:

    file = fopen("rules1.txt", "r");
    write = fopen("rules2.txt", "w");   
    char linec [64]; /* line size */
    int i = 0;

    while (fgets(linec, sizeof(linec), file)) {  /* read line from file */
        i++;
        if(i < char_line) {
            fprintf (write , linec); /* write line to file */
        }
    }

    fclose(file);
    fclose(write);

    return(0);   
}  

1 个答案:

答案 0 :(得分:1)

您已声明int char_line;,稍后您已编码

    char_line ="%d";

这是废话。由于文字字符串是一些char[]数组(更好地将其视为一些常量数组),因此衰减为指针,并且指向int的指针根本没有意义。在许多机器上(特别是x86-64),指针有64位,但int只有32位。

请使用所有警告和调试信息编译您的代码,因此gcc -Wall -Wextra -gGCC一致,改进代码以获取警告,然后使用调试器 {{3 }}

花几天时间阅读一些关于C编程的好书。要注意并努力避免gdb。使用调试器逐步运行程序并查询其状态以了解发生的情况。

阅读您正在使用的每个标准功能的undefined behavior,例如documentation

您可能想要一个读取每一行的循环,并将有时该行复制到另一个文件。