|
| RAM filer Fra : CodeMonkey | Vist : 582 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();
| |
|
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?
| |
|
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.
| |
|
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?
| |
|
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);
| |
|
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.
| |
|
Ja, men den første karakter du skriver i filen ('a') overskriver den sidste karakter, pga. din seekp
| |
|
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>
| |
|
jeg prøvede lige det du forslog (bertelbrander) altså file.seekp(0, ios::end);
og nu bliver der slet ikke skrevet noget i filen.
| |
|
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
| |
|
Det forstår jeg ikke, her virker det uden problemer.
Hvilken compiler bruger du?
| |
| Kommentar Fra : molokyle |
Dato : 18-03-07 20:12 |
| | |
|
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();
}
| |
|
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.
| |
| 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.
| |
|
|