Slet linje

Tags:    c++ esbjerg fredericia frederikshavn horsen

<< < 12 > >>
Jeg har en kode som skal slette en linje i en fil, det gør den ved at jeg skriver hele indholdet af filen til den igen, men uden den linje som ikke skal være der! nu er problemet så bare at den sidste linje kommer til at stå to gange, da der jo bliver en linje mindre at skrive, fx:

Fil før ændring:
-----------------------
linje 1
linje 2
linje 3
linje 4
linje 5
-----------------------

Fil efter ændring:
-----------------------
linje 1
linje 2
linje 4
linje 5
linje 5
-----------------------

Hvis jeg så går ind og skriver en blank linje i stedet for den sidste, bliver vil den jo stadig blive talt med med/læst ind da der er lavet et new line engang:

Fil efter ændring:
-----------------------
linje 1
linje 2
linje 4
linje 5

-----------------------

Hvordan kan jeg komme uden om det? håber i forstår problemet, kan godt forstå det er lidt forsvært
//Søren



15 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Det var måske lettere at finde fejlen hvis vi kunne se koden, anyway:

Jeg tror at det er fordi du har:

while(!feof(file))
{
fgets(...)
if(!Whatever)
fprintf(...);
}

Problemet er her at feof først returnerer true når man har forsøgt at læse ud over enden på filen, derved kommer det til at se ud som om at man læser den sidste linie to gange, fordi den sidste fgets fejler.

Fixet er at checke returværdien fra fgets, i stil med:

while(fgets(...))
{
if(!Whatever)
fprintf(...);
}



Det var måske lettere at finde fejlen hvis vi kunne se koden, anyway:

Jeg tror at det er fordi du har:

while(!feof(file))
{
fgets(...)
if(!Whatever)
fprintf(...);
}

Problemet er her at feof først returnerer true når man har forsøgt at læse ud over enden på filen, derved kommer det til at se ud som om at man læser den sidste linie to gange, fordi den sidste fgets fejler.

Fixet er at checke returværdien fra fgets, i stil med:

while(fgets(...))
{
if(!Whatever)
fprintf(...);
}

Jeg tror ikke det er det, da den kun laver problemet når jeg har slettet en linje, hvis jeg tilføjer en linje sker der ikke nogle unormaliteter...
//Søren



Er det her en julegættekonkurence eller er din kode meget hemmelig?

Man kunne forstille sig:

char Line[1024][1024];
int Size;

for(Size = 0; fgets(Line[Size], 1024, MyFile); Size++)
{}

if(Ole)
{ // remove line 32
memmove(&Line[32], &Line[33], 1024*(1024 + 33));
}

for(int x = 0; x < Size;x++)
fprintf("%s" Line[x]);

Det ses at Size skal tælles én ned i if(Ole) {...}

Man kunne også forestille sig at det ikke fejler når du skal tilføje en linie fordi du der bruger noget andet kode hvor du åbner filen i append mode.

Desværre er min krystalkogle til eftersyn i denne uge så jeg har ikke noget bedre bud.

[Redigeret d. 02/12-04 19:26:37 af Bertel Brander]



Er det her en julegættekonkurence eller er din kode meget hemmelig?

Man kunne forstille sig:

char Line[1024][1024];
int Size;

for(Size = 0; fgets(Line[Size], 1024, MyFile); Size++)
{}

if(Ole)
{ // remove line 32
memmove(&Line[32], &Line[33], 1024*(1024 + 33));
}

for(int x = 0; x < Size;x++)
fprintf("%s" Line[x]);

Det ses at Size skal tælles én ned i if(Ole) {...}

Man kunne også forestille sig at det ikke fejler når du skal tilføje en linie fordi du der bruger noget andet kode hvor du åbner filen i append mode.

Desværre er min krystalkogle til eftersyn i denne uge så jeg har ikke noget bedre bud.

[Redigeret d. 02/12-04 19:26:37 af Bertel Brander]


LOL nej det er det ikke, troede ikke det kunne være så svært at forstå, men der kommer da lidt kode her ;)

ofstream out_fil("filen.txt");
if (out_fil.is_open()){
while(x<=xx-1){
if(slet == x){
}else{
out_fil << et[x] << "\\n";
}
x++;
}
}out_fil.close();

xx er hvor mange linjer der er i filen, og skal skrives igen, og slet er det linje nr som ikke skal skrive igen (altså slettes). Håber i forstår...
//Søren



Jeg kan ikke se noget problem i din kode:

Fold kodeboks ind/udKode 


Så fejlen må ligge i noget af det kode vi ikke kan se.



Jeg kan ikke se noget problem i din kode:

Fold kodeboks ind/udKode 


Så fejlen må ligge i noget af det kode vi ikke kan se.


Jamen så får i da lige koden som læser fra filen også

ifstream input_fil2("filen.txt", ios::in | ios::binary);
while(!input_fil2.eof()){
input_fil2.getline(et[xx],sizeof(et));
xx++;
}
input_fil2.close();

problemet liger jo i at den læser en blank linje i bunden fordi at der har været skrevet på den, ligesom hvis man i word trykker enter, og den skrifter linje og man skal trykke slet (eller hvad den knap nu hedder) for at få den nye linje væk... håber det hjalp lidt på forståelsen...

//Søren



Der har vi netop problemet.

Den læser den sidste linie to gange, kan fixes med:

while(!input_fil2.eof()){

input_fil2.getline(et[xx],sizeof(et));
if(!input_fil2.eof()) {
xx++;
}
}

Eller bedre, brug getline i while(...), som i mit eksempel.



Der har vi netop problemet.

Den læser den sidste linie to gange, kan fixes med:

while(!input_fil2.eof()){

input_fil2.getline(et[xx],sizeof(et));
if(!input_fil2.eof()) {
xx++;
}
}

Eller bedre, brug getline i while(...), som i mit eksempel.


Er det det der er problemet? syntes det er underligt det kun er når jeg har prøvet at slette en linje problemet kommer, det er jo heller ikke fordi den kommer til eof, da der stadig er en tom linje som bliver talt med... men prøver lige at kigge på det
//Søren



Kom lige til at se jeg har været opmærksom på det, har en xx--; efter while'en er færdig, så den trækker den sidste fra... så det er ikke det... detsværre
//Søren



Kom lige til at se jeg har været opmærksom på det, har en xx--; efter while'en er færdig, så den trækker den sidste fra... så det er ikke det... detsværre
//Søren


Hvis du kører mit eksempel fra 03-12-04 21:12, fjerner den så ikke en linie uden at lave to af den sidste ?

Må jeg se hele koden, eller nok til at kunne provokere fejlen ?



<< < 12 > >>
t