Този кодов фрагмент работи с първия цикъл 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

person aaks-ctrl    schedule 08.06.2020    source източник
comment
Вероятно искате да нулирате temp=1 след като прочетете първия файл.   -  person Johnny Mopp    schedule 08.06.2020
comment
stackoverflow.com/questions/62256572/ се концентрира върху pmg коментар. Също така изтрихте този въпрос, който е почти абсолютно същият - моля, редактирайте въпроса си и възстановете изтриването го следващия път.   -  person KamilCuk    schedule 08.06.2020
comment
Какъв тип са ch1 и ch2? Те трябва да са тип int.   -  person Ian Abbott    schedule 08.06.2020
comment
OT: Кодът за while циклите може да бъде малко опростен, напр. ch1 = getc(lname); while (ch1 != EOF) { if (temp != delete_line) putc(ch1, rep); if (ch1 == '\n') temp++; ch1 = getc(lname); }.   -  person Ian Abbott    schedule 08.06.2020
comment
@Ian Abbott, което оставя празен ред във файла, ако редът за изтриване е иницииран като 1   -  person aaks-ctrl    schedule 08.06.2020
comment
@aaks-ctrl Не, не става.   -  person Ian Abbott    schedule 08.06.2020
comment
относно: ` rep = fopen(rep.txt, w+);` 1) w в режима води до съкращаване на съдържанието на файла до нищо по време на процеса на отваряне на файла. 2) когато извиквате fopen(), винаги проверявайте (!=NULL) върнатата стойност, за да сте сигурни, че операцията е била успешна.   -  person user3629249    schedule 09.06.2020
comment
OT: относно: ch2 = getc(id); while (ch2 != EOF) много по-добре да комбинирате тези два реда в: while( (ch2 = getc(id) ) != EOF ) и да премахнете повикването към getc() в края на цикъла   -  person user3629249    schedule 09.06.2020


Отговори (2)


Линията

ch1 = getc(lname);

съкращава върнатата стойност на getc от int на char. Следователно, условието за цикъл

while (ch1 != EOF)

винаги ще бъде вярно, защото EOF не може да бъде представено в char.

За да поправите това, трябва да декларирате ch1 да има тип int вместо char.

person Andreas Wenzel    schedule 08.06.2020

относно: Това, което не е наред с този код, е, че не работи след първия файл, т.е. вторият файл не се изтрива, нито се създава нов файл с пропуснатия ред на файла. какъв е проблема? Трябва ли да прави нещо с функцията за премахване на преименуване?

оригиналният файл: rep.txt всъщност се изтрива.

Това обаждане обаче:

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

създава празен файл със същото име.

person user3629249    schedule 09.06.2020