Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
只写C程序?到新文件_C - Fatal编程技术网

只写C程序?到新文件

只写C程序?到新文件,c,C,我有这个计划: int countLineTotal(FILE *file) { int line = 1; int ch = 'a'; while (ch != EOF) { ch = fgetc(file); if (ch == '\n') { line++; } } return line; } void removeLine(char *name_of_file, int

我有这个计划:

int countLineTotal(FILE *file) {
    int line = 1;
    int ch = 'a';

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

void removeLine(char *name_of_file, int delete_line) {

    FILE *source_file;
    FILE *temporary_file;
    int temp = 1;
    int ch = 'a';

    source_file = fopen(name_of_file, "r");
    if (source_file == NULL)
    {
        perror("Could not open file: "); 
        return 1;
    }

    int line_total = countLineTotal(source_file);
    /*
        verify entered line number is valid
    */

    temporary_file = fopen("remove.temp", "w");
    if (temporary_file == NULL)
    { 
        perror("Could not open 'remove.temp': "); 
        return 1;
    }

    while (ch != EOF) {
        ch = fgetc(source_file);
        if (temp != delete_line) {
            putc(ch, temporary_file);
        }
        if (ch == '\n') {
            temp++;
        }
    }

    fclose(source_file);
    fclose(temporary_file);
    remove(name_of_file);
    rename("remove.temp", name_of_file);
}

int main() {
    int line_num = 3;
    char *file_name = "myfile.txt";

    removeLine(file_name, line_num);
    return 0;
}
myfile.txt的内容

content on line1
content on line2
content on line3
content on line4
content on line5
?
myfile.txt中的最终输出:

content on line1
content on line2
content on line3
content on line4
content on line5
?
程序要么不向临时文件写入任何内容,要么用。。。没有什么?在尝试调试时,我注意到当
temp
1
时,
while(ch!=EOF)
退出,并且从不高于此值。根本不知道这是为什么

编辑:更新代码。
在添加我遗漏的代码后,我意识到我忘记将指针设置回文件的开头。。。这就解释了为什么温度从来都不高于1。

下面的代码有效。使用tkdiff之类的工具检查差异。我更改了一些内容,例如file_name[12]和while循环以执行{}while(),因为在读取“ch”的任何值之前,不能检查“ch”。代码现在可以工作了

注释:“删除”和“重命名”在这个程序中是非常危险的。若您调用程序两次,那个么和原始文件相比,您已经删除了第3行和第4行。而是先创建一个副本,或者创建一个备份。。。无论如何,这不是你的问题

#include <stdio.h>
#include <stdlib.h>

void removeLine(char *name_of_file, int delete_line) {

    FILE *source_file;
    FILE *temporary_file;
    int temp = 1;
    char ch;
    
    source_file = fopen(name_of_file, "r");
    if (source_file == NULL)
    {
        printf("Could not open file: "); 
        return;
    }

    temporary_file = fopen("remove.temp", "w");
    if (temporary_file == NULL)
    { 
        printf("Could not open 'remove.temp': "); 
        return;
    }

    do{
        ch = fgetc(source_file);
        if (temp != delete_line) {
            fputc(ch, temporary_file);
        }
        if (ch == '\n') {
            temp++;
        }
    }while(ch != EOF);

    fclose(source_file);
    fclose(temporary_file);
    remove(name_of_file); // NOT GOOD
    rename("remove.temp", name_of_file); // NOT GOOD

}

int main() {
    int line_num = 3;
    char file_name[12] = "myfile.txt";

    removeLine(file_name, line_num);
    return 0;
}


我意识到我忘了将指针设置回文件的开头,所以程序开始从文件的结尾读取。这解释了为什么
temp
从未高于1。

而(ch!=EOF)
导致未定义的行为,因为
ch
从未初始化。您需要读取该字符,然后检查它是否为EOF(而不是相反),使用编译器as
gcc-Wall-Wextra-g
编译您的程序。对其进行改进,使其不会收到警告。然后使用调试器了解程序的行为。阅读与您正在使用的相关文档;您可能想使用you have no error check对
fopen
的调用进行检查。您仍然以错误的顺序读取和写入ch。思考阅读
EOF
后会发生什么请提取a并将其包含在您的问题中。