Avatar billede twm Nybegynder
18. december 2001 - 11:39 Der er 17 kommentarer og
1 løsning

MFC Filbehandling

Hej
Jeg har et program, som går ind og laver en masse data i en fil. Når programmet afsluttes, skal der på den første linje i filen, skrives nogle værdier.
Til dette bruger jeg CStdioFile, problemet er at den overskriver data i filen, byte vis. Er der nogen der har en løsning til hvordan man undgår dette. Dvs jeg vil gerne have den til at \"skubbe\" dataene, så den ikke overskriver noget!

Man kan selvfølgelig streame filen på ny, men jeg syntes ikke det er den rigtige løsning, der må være en bedre.

Her er den kode jeg bruger nu:

CStdioFile fileop( LPCTSTR(strDatafilename), CFile::modeWrite );
fileop.SeekToBegin();
CString tempi(\"123\\t123\\t123\\t123\\t123\\t123\\n\");
fileop.WriteString(LPCTSTR(tempi));

Mvh
Torben
Avatar billede chries Nybegynder
18. december 2001 - 11:41 #1
mine forlag er:

1. afsæt plads når du opretter filen.
2. Læs hele filen op i hukommelsen og skriv header + fil ned igen.
Avatar billede jpk Nybegynder
18. december 2001 - 11:42 #2
Hvad med at lave plads til det du skal indsætte, først i filen?
(Kender du længden herpå?)
Avatar billede chries Nybegynder
18. december 2001 - 11:42 #3
..forslag..
Avatar billede twm Nybegynder
18. december 2001 - 11:50 #4
Linjen jeg skal skrive i toppen kan variere, da det er max værdier i integers.

Jeg har også tænkt på at lave en temp fil og så streame den en gang til, men der må da være en løsning. Tænk hvis filen fylder 10 mb så vil det tage temmelig lang til at streame den igen. :)
Avatar billede jpk Nybegynder
18. december 2001 - 11:55 #5
Så vidt jeg kan se sker læsning/skrivning linievis og bør altså ikke overskrive efterfølgende linier...

Avatar billede chries Nybegynder
18. december 2001 - 11:57 #6
Jeg tror ikke du kan indsætte data og derved flytte det andet. Det ville kræve at filen skal \"vokse baglens :-)\" (hvad jeg ikke tror er muligt) eller at den flytter alle \"10MB\" for hver byte du tilføjer i starten af fil ( hvilket ville være meget langsom).

En anden ting man kunne gøre er at ligge dem i en fil ved siden af, altså to filer, en med data og en med max værdier.
Avatar billede jpk Nybegynder
18. december 2001 - 12:00 #7
Hvis du skriver et \'\\n\' i første linie, burde du til sidst kunne overskrive denne med den aktuelle streng.

Avatar billede twm Nybegynder
18. december 2001 - 12:03 #8
jpk >> sådan ser data ud efter den er blevet skrevet:
881    144    240    0    2380    585
00    240    5    91    20
60    86    240    4    142    31
anden linje skulle gerne starte på 20!

chries >> Hvad med tekstbehandlings programmer, det kan da ikke passe at de skriver det hele ned, hvergang man tilføjer noget? Jeg er ikke meget for at have en ekstra fil for hver db, da filstrukturen allerede er ret omfattende! ;)

Avatar billede jpk Nybegynder
18. december 2001 - 12:10 #9
Kan du ikke beregne (eller hvad du nu gør) værdierne før du skriver til filen?

Avatar billede twm Nybegynder
18. december 2001 - 12:13 #10
jeg kan sagtens regne længden ud efter databasen er skrevet, men jeg ved jo ikke hvor meget plads jeg skal afsætte under init af databasen.
Avatar billede chries Nybegynder
18. december 2001 - 12:14 #11
den med \\n går ikke, det vædder jeg 50 point på :-)
Jeg er meget sikker på at rene tekst filer bliver skrevet helt ned igen ved gem. (eller fra første ændring i filen)
Avatar billede chries Nybegynder
18. december 2001 - 12:16 #12
Skal filen være tekst baseret ?
Avatar billede chries Nybegynder
18. december 2001 - 12:17 #13
Og hvad præsis er det du skal have ned i filen ? en masse tal og noget der fortæller hvor mange der er ?
Avatar billede jpk Nybegynder
18. december 2001 - 12:18 #14
Okay, du kan sikkert finde et maksimalt antal tegn første linie fylder.
Så skrive det antal spaces først, det virker i hvert fald!
fileop.WriteString(\"                                          \\n\");
Avatar billede jpk Nybegynder
18. december 2001 - 12:22 #15
Du skriver at din filstruktur er kompliseret, hvad med at bruge compound filer?
En compound fil har en intern filstruktur, det er sådan nogle fx Word bruger, så kan man skrive en stream uden at tænke på en anden.

Fx:

File
|-One section
|-Another section
.
|-Last section

Avatar billede mbulow Nybegynder
18. december 2001 - 15:11 #16
Er det sådan at den fil du skriver til er i et allerede defineret format, eller har du frihed til at ændre lidt på det?

Hvis du kan ændre lidt på formatet kunne du jo evt. gøre følgende:
1) Reserver plads til et tal (En fil-position)
2) Skriv alle dine data
3) Skriv max-værdierne
4) Skriv startposition for max-værdierne i den reserverede plads

Hvis du gemmer max-positionen binært skal du jo bare reservere 4 bytes.
Hvis du gemmer max-positionen som tekst skal du vel bare reservere plads nok til det største tal (10 cifret tal)
Avatar billede twm Nybegynder
19. december 2001 - 09:35 #17
Jeg bliver nødt til at lave det med en temp fil, da vi skal aflevere projektet fredag. Det er det sidste vi mangler!

Tak for de mange svar!

Mvh
Torben
Avatar billede soepro Nybegynder
19. december 2001 - 13:30 #18
twn >> Din observation i forhold til at \"flytte\" de 10 MB til slutningen er helt korrekt - det ER nødvendigt. Den måde de fleste programmer \"omgår\" problemet evd, er ved at reserver en \"blok\" (f.eks. 1024 tegn) i starten af filen til formålet, og så blot sikre dig at din kontrolstruktur ikke overstiger de 1024 bytes der er sat af til det. Nadre bygger som jpk beskriver det, en slag index-struktur i starten af filen (stadig f.eks.1024 bytes) og lader den pege på de enkelte afsnit. Herved KAN din kontrolstruktur jo godt ligge til sidst i filen - du skal så bare sørge for at der i de første 1024 bytes ligger et offset der fortæller dig hvor langt frem i filen du skal, for at få fat i kontrol-strukturen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester