我试图完成以下任务:
我有一个带有最后一个可打印字符的文本文件"]"在一个单独的行。
该行不必是文件的最后一行。可以有一些空白行(换行符)。
该项目的目的是在"]"。行之前插入新文本 我尝试实现这一点的方法是从文件末尾搜索文件,找到带有字符"]"的行号。 (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);
}
答案 0 :(得分:1)
您已声明int char_line;
,稍后您已编码
char_line ="%d";
这是废话。由于文字字符串是一些char[]
数组(更好地将其视为一些常量数组),因此衰减为指针,并且指向int
的指针根本没有意义。在许多机器上(特别是x86-64),指针有64位,但int
只有32位。
请使用所有警告和调试信息编译您的代码,因此gcc -Wall -Wextra -g
与GCC一致,改进代码以获取警告,然后使用调试器 {{3 }}
花几天时间阅读一些关于C编程的好书。要注意并努力避免gdb
。使用调试器逐步运行程序并查询其状态以了解发生的情况。
阅读您正在使用的每个标准功能的undefined behavior,例如documentation。
您可能想要一个读取每一行的循环,并将有时该行复制到另一个文件。