/ Forside/ Teknologi / Udvikling / C/C++ / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
RAM filer
Fra : CodeMonkey
Vist : 570 gange
25 point
Dato : 18-03-07 17:54

nedenstående kode laver en tekst fil med med karakterne abc. Jeg forstår hvorfor at sidste karakter i filen bliver overskrevet, når jeg køre programmet når filen allerede eksistere.(jeg ved godt at jeg kan bruge ios::app som open mode)


fstream file;
   file.open("testfil.txt", ios::in | ios::out /*| ios::binary */);
   if (!file) {
      file.clear();
      file.open("testfil.txt", ios::out /*| ios::binary*/);
cout << "Cannot open file.\n";
// handle error ...
}
   else{
   file.seekp(-1, ios::end);
   }
   
   int statusword = file.rdstate();

if ( statusword & ios::eofbit )
cout << "EOF encountered\n";
else if ( statusword & ios::failbit )
cout << "Non-Fatal I/O error\n";
else if ( statusword & ios::badbit )
cout << "Fatal I/O error\n";

   
   file.put('a');
   file.put('b');
   file.put('c');
   file.close();

 
 
Kommentar
Fra : justuniverse


Dato : 18-03-07 18:37

Jeg forstår ikke helt spørgsmålet. Mangler der et "ikke" et eller andet sted i din tekst?

Er det teksten inde i filen, der bliver overskrevet eller er det filnavnet?

Kommentar
Fra : CodeMonkey


Dato : 18-03-07 19:32

Det er den sidste karakter af teksten inde i filen der bliver overskrevet, med den første karakter af det der skrives til filen når programmet bliver kørt igen.

Kommentar
Fra : justuniverse


Dato : 18-03-07 19:40

Jeg har desværre ikke installeret noget c++ udvikling pt, men er der måske en metode på "file" der kan sikre, at man starter fra "lige efter sidste index" af den eksisterende tekst?

Hvad er attributterne på filen, når den bliver dannet første gang. Måske er den beskyttet, så man ikke kan putte mere i den, men man kan få lov at ændre det eksisterende? Så i 2. programkørsel vil sidste karakter plive overskrevet, men efterfølgende "put"s vil gå galt, fordi man ikke må skrive mere?

Kommentar
Fra : BertelBrander


Dato : 18-03-07 19:48

Denne linje:
file.seekp(-1, ios::end);

Sætter fil pointeren til lige før den sidste karakter i filen, derfor vil den overskrive det sidste tegn i filen, hvis filen fandtes når programmet køres.

Hvis ikke programmet skal overskrive den sidste karakter skal du bruge:
file.seekp(0, ios::end);

Kommentar
Fra : CodeMonkey


Dato : 18-03-07 19:50

Det er ikke tilfældet, da total set efter hver kørsel af programmet er vokset. Med andre ord figuere alle karaktere fra nyeste program kørsel altid i filen.

Kommentar
Fra : BertelBrander


Dato : 18-03-07 19:53

Ja, men den første karakter du skriver i filen ('a') overskriver den sidste karakter, pga. din seekp

Kommentar
Fra : CodeMonkey


Dato : 18-03-07 19:54

min seneste kommentar er til just universe(havde ikke lige set din kommentar BertelBrander)

Kommentar
Fra : molokyle


Dato : 18-03-07 19:55

Øeh... jeg er også MEGET 'rusten' i C/C++ , men du husker vel at en fils (..og strengs, og arrays) første karakter indexeres fra værdien 0 og ikke fra værdien 1? (Position 1 = værdi 0 !)

..og noget som springer i øjet:

file.seekp(-1, ios::end);

Søg til enden af filen og ryk een karakter 'baglæns' ??? ..så 'ryger' den sidste karakter i filen da?

</MOLOKYLE>





Kommentar
Fra : CodeMonkey


Dato : 18-03-07 20:01

jeg prøvede lige det du forslog (bertelbrander) altså file.seekp(0, ios::end);

og nu bliver der slet ikke skrevet noget i filen.



Kommentar
Fra : justuniverse


Dato : 18-03-07 20:03

Ja, det ser ud til, at det har noget med indexeringen at gøre. Men som sagt kan jeg ikke engang efterprøve det... så jeg trækker mig. Held og lykke med projektet

Kommentar
Fra : BertelBrander


Dato : 18-03-07 20:07

Det forstår jeg ikke, her virker det uden problemer.
Hvilken compiler bruger du?

Kommentar
Fra : molokyle


Dato : 18-03-07 20:12
Kommentar
Fra : CodeMonkey


Dato : 18-03-07 20:13

Jeg bruger Visual Studio 2005

Måske kunne du lige copy paste din kode ind her, så kunne jeg lige prøve at køre det.

Accepteret svar
Fra : BertelBrander

Modtaget 25 point
Dato : 18-03-07 20:17

#include <fstream>
#include <iostream>
using namespace std;
int main()
{

fstream file;
file.open("testfil.txt", ios::in | ios::out /*| ios::binary */);
if (!file)
{
file.clear();
file.open("testfil.txt", ios::out /*| ios::binary*/);
cout << "Cannot open file.\n";
// handle error ...
}
else
{
file.seekp(0, ios::end);
}

int statusword = file.rdstate();

if ( statusword & ios::eofbit )
cout << "EOF encountered\n";
else if ( statusword & ios::failbit )
cout << "Non-Fatal I/O error\n";
else if ( statusword & ios::badbit )
cout << "Fatal I/O error\n";


file.put('a');
file.put('b');
file.put('c');
file.close();
}

Kommentar
Fra : CodeMonkey


Dato : 18-03-07 20:32

takker for hjælpen. Grunden til at det ikke virkede var at jeg også brugte til seekg() til at læse på noget af filen ind imellem mit kald til seekp() og mine skrive operationer(den del havde jeg udeladet her da jeg jo så fejlagtig troede at det ikke havde nogen indflydelse). Efter at jeg flyttede alle læse operationer til starten af koden og altså før jeg kaldte seekp() så virkede det.

Godkendelse af svar
Fra : CodeMonkey


Dato : 18-03-07 20:40

Tak for svaret BertelBrander.

Kommentar
Fra : molokyle


Dato : 18-03-07 20:49

..så 'rusten' var jeg altså alligevel ikke

</MOLOKYLE>



Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408857
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste