只写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(而不是相反),使用编译器asgcc-Wall-Wextra-g
编译您的程序。对其进行改进,使其不会收到警告。然后使用调试器了解程序的行为。阅读与您正在使用的相关文档;您可能想使用you have no error check对fopen
的调用进行检查。您仍然以错误的顺序读取和写入ch。思考阅读EOF
后会发生什么请提取a并将其包含在您的问题中。