C语言 此代码片段在第一个 while 循环中工作,但不执行它之后的循环



这段代码应该跳过一行文件,将其他所有内容写入不同的文件中,删除原始文件,并将不同的文件重命名为已删除的文件。这段代码的问题在于它在第一个文件之后不起作用,即第二个文件被删除,也没有使用跳过的文件行创建新文件。问题出在哪里?它是否必须与重命名删除功能有关?

FILE *lname
FILE *id
FILE *rep
lname = fopen("lname.txt", "r");
id = fopen("id.txt", "r");
rep = fopen("rep.txt", "w+");
char ch1,ch2;
int temp=1,delete_line=3; /*(delete_line is supposed to be taken as an input)*/
ch1 = getc(lname);
while (ch1 != EOF)
{
if (ch1 == 'n')
temp++;
if(delete_line==1) {
if (temp == 2 && ch1 == 'n')
ch1 = getc(lname);
}
if (temp != delete_line)
putc(ch1, rep);
​
ch1 = getc(lname);
}
fclose(lname);
fclose(rep);
remove("lname.txt");
rename("rep.txt","lname.txt");
rep = fopen("rep.txt", "w+");
​
ch2 = getc(id);
while (ch2 != EOF)
{
if (ch2 == 'n')
temp++;
//except the line to be deleted
if (temp == 2 && ch2 == 'n') //making sure to skip a blank line if delete_line=1
ch2 = getc(id);
​
if (temp != delete_line)
putc(ch2, rep);
​
ch2 = getc(id);
}
fclose(id);
fclose(rep);
remove("id.txt");
rename("rep.txt","id.txt");

ID 中的数据.txt

asd123
xcv1323
rijr123
eieir2334

数据在 lname.txt

Bipul Das
Star Lord
Tony Stark
Vin Diesel

ch1 = getc(lname);

getc的返回值从int截断为char。因此,while 循环条件

while (ch1 != EOF)

将永远为真,因为EOF无法在char中表示。

若要解决此问题,必须将ch1声明为具有int类型而不是char

关于:这段代码的问题在于它在第一个文件之后不起作用,即第二个文件被删除,也没有使用跳过的文件行创建新文件。 问题出在哪里?它是否必须与重命名删除功能有关?

原始文件:rep.txt实际上正在被删除。

但是,此调用:

rep = fopen("rep.txt", "w+");

创建一个同名的空文件。

最新更新