/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Læse slutningen af en fil
Fra : Søren \"Pengman\" Pe~


Dato : 11-06-03 11:08

Hej folkens

I et projekt jeg er igang med har jeg behov for at læse de sidste 128 bites
af en fil (ID3-tagget i en mp3-fil)
Hvordan gøres dette??

Er der er en speciel opening mode der gør at man starter med sin pointer
sidst i filen?? Eller er det nødvendigt at kende filstørrelsen og så flytte
pointeren fra starten af filen?? Eller hvordan??

På forhånd tak
Søren



 
 
Mads Jensen (11-06-2003)
Kommentar
Fra : Mads Jensen


Dato : 11-06-03 11:39

Hej

"Søren "Pengman" Pedersen" wrote:
> I et projekt jeg er igang med har jeg behov for at læse de sidste 128
bites
> af en fil (ID3-tagget i en mp3-fil)
> Hvordan gøres dette??

ios::ate sætter pointeren i slutningen af filen, hvordan man så flytter
den -128 op, kan jeg desværre ikke lige hitte ud af.
http://www.cppreference.com/cppio_details.html

mvh.
Mads
--
Mads Jensen
http://www.ddfr.dk Dansk Donaldist-Forening



Michael Rasmussen (11-06-2003)
Kommentar
Fra : Michael Rasmussen


Dato : 11-06-03 11:42

On Wed, 11 Jun 2003 12:08:08 +0200, Søren "Pengman" Pedersen wrote:

> Hej folkens
>
> I et projekt jeg er igang med har jeg behov for at læse de sidste 128 bites
> af en fil (ID3-tagget i en mp3-fil)
> Hvordan gøres dette??
>
> Er der er en speciel opening mode der gør at man starter med sin pointer
> sidst i filen?? Eller er det nødvendigt at kende filstørrelsen og så flytte
> pointeren fra starten af filen?? Eller hvordan??
>
Prøv at se på fseek eller lseek (Low level IO).
--
Hilsen/Sincerely, Michael Rasmussen

En windows admin er en person, for hvem den største bedrift er, at
lave konfiguration af serveren med trial and error via en gui.


Bertel Brander (11-06-2003)
Kommentar
Fra : Bertel Brander


Dato : 11-06-03 19:22

Michael Rasmussen wrote:
> On Wed, 11 Jun 2003 12:08:08 +0200, Søren "Pengman" Pedersen wrote:
>
>
>>Hej folkens
>>
>>I et projekt jeg er igang med har jeg behov for at læse de sidste 128 bites
>>af en fil (ID3-tagget i en mp3-fil)
>>Hvordan gøres dette??
>>
>>Er der er en speciel opening mode der gør at man starter med sin pointer
>>sidst i filen?? Eller er det nødvendigt at kende filstørrelsen og så flytte
>>pointeren fra starten af filen?? Eller hvordan??
>>
>
> Prøv at se på fseek eller lseek (Low level IO).

Vær dog opmærksom på følgende note fra C-standarden:

"Setting the file position indicator to end-of-file, as with
fseek(file, 0, SEEK_END), has undefined behavior for a binary stream
(because of possible trailing null characters) or for any stream
with state-dependent encoding that does not assuredly end in the initial
shift state."

Så den eneste rigtige metode er at læse en karakter af gangen fra filen
indtil, du er ved enden af filen, herefter bruger man fseek(file, -16,
SEEK_CUR); og til slut læse de 16 karakterer med f.ex fread.

lseek er ikke en standard c funktion.

/b


Christian Larsen (11-06-2003)
Kommentar
Fra : Christian Larsen


Dato : 11-06-03 19:48

Bertel Brander <bertel@post4.tele.dk> wrote in
news:3ee7732f$0$5164$edfadb0f@dread11.news.tele.dk:

> Så den eneste rigtige metode er at læse en karakter af gangen fra
> filen indtil, du er ved enden af filen, herefter bruger man
> fseek(file, -16, SEEK_CUR); og til slut læse de 16 karakterer med f.ex
> fread.

Helt så kompliceret tror jeg ikke, det behøver at være i denne situation,
for jeg har da brugt netop den fremgangsmåde uden problemer flere gange -
netop til det formål, at læse ID3-tags fra MP3-filer.

Vh
Christian Larsen

Bertel Brander (11-06-2003)
Kommentar
Fra : Bertel Brander


Dato : 11-06-03 22:40

Christian Larsen wrote:
> Bertel Brander <bertel@post4.tele.dk> wrote in
> news:3ee7732f$0$5164$edfadb0f@dread11.news.tele.dk:
>
>
>>Så den eneste rigtige metode er at læse en karakter af gangen fra
>>filen indtil, du er ved enden af filen, herefter bruger man
>>fseek(file, -16, SEEK_CUR); og til slut læse de 16 karakterer med f.ex
>>fread.
>
>
> Helt så kompliceret tror jeg ikke, det behøver at være i denne situation,
> for jeg har da brugt netop den fremgangsmåde uden problemer flere gange -
> netop til det formål, at læse ID3-tags fra MP3-filer.
>
At det ser ud til at virke med den kompiler du bruger på den platform du
bruger, beviser ikke at det vil virke på alle platforme med alle
kompilere; det er faktisk det vi har c-standarden til.

/b


guppy (15-06-2003)
Kommentar
Fra : guppy


Dato : 15-06-03 19:41

Lidt nemmere sådan her:
//Der er en metode til at hente filen størrelse - kan be ikke huske hvad den
hedder ;) så vi kalder den filesize(file)...

fseek(file, filesize(file)-16, SEEK_CUR);



"Bertel Brander" wrote in message
news:3ee7732f$0$5164$edfadb0f@dread11.news.tele.dk...
>
> "Setting the file position indicator to end-of-file, as with
> fseek(file, 0, SEEK_END), has undefined behavior for a binary stream
> (because of possible trailing null characters) or for any stream
> with state-dependent encoding that does not assuredly end in the initial
> shift state."
>
> Så den eneste rigtige metode er at læse en karakter af gangen fra filen
> indtil, du er ved enden af filen, herefter bruger man fseek(file, -16,
> SEEK_CUR); og til slut læse de 16 karakterer med f.ex fread.
>
> lseek er ikke en standard c funktion.
>
> /b
>



Rasmus Christian Kaa~ (16-06-2003)
Kommentar
Fra : Rasmus Christian Kaa~


Dato : 16-06-03 11:57


"guppy" <guppy@no.spam:decoder.dk> wrote in message
news:bciei9$tbv$1@jarjarbinks.mobilixnet.dk...
> Lidt nemmere sådan her:
> //Der er en metode til at hente filen størrelse - kan be ikke huske hvad
den
> hedder ;) så vi kalder den filesize(file)...
>
> fseek(file, filesize(file)-16, SEEK_CUR);


hvor finder du funktionen filesize henne? den er ikke min C bog.



guppy (16-06-2003)
Kommentar
Fra : guppy


Dato : 16-06-03 15:08


"Rasmus Christian Kaae" <kaaeHEJ@VENdaimi.au.dk> wrote in message
news:bck7po$1v6$1@news.net.uni-c.dk...
>
> "guppy" <guppy@no.spam:decoder.dk> wrote in message
> news:bciei9$tbv$1@jarjarbinks.mobilixnet.dk...
> > Lidt nemmere sådan her:
> > //Der er en metode til at hente filen størrelse - kan be ikke huske hvad
> den
> > hedder ;) så vi kalder den filesize(file)...
> >
> > fseek(file, filesize(file)-16, SEEK_CUR);
>
>
> hvor finder du funktionen filesize henne? den er ikke min C bog.
>
Kunne som sagt ikke huske hvad den hed - den hedder filelength...

i <io.h> filelength(fileno(f)); //hvor f er en FILE*

eksempel:

main.cpp:
-------------------
#include <stdio.h>
#include <stdlib.h> //for pause..
#include <io.h>
void main ()
{
FILE* f = fopen("main.cpp", "rb");
if(f == NULL)
{
printf("Error opening file\n");
system("pause");
exit(0);
}
long fileSize = filelength(fileno(f));
printf("main.cpp er %i bytes",fileSize);
fclose(f);
system("pause");
}
-------------------

/Guppy



Rasmus Christian Kaa~ (16-06-2003)
Kommentar
Fra : Rasmus Christian Kaa~


Dato : 16-06-03 15:14

> Kunne som sagt ikke huske hvad den hed - den hedder filelength...
>
> i <io.h> filelength(fileno(f)); //hvor f er en FILE*

[kaae@horse02]$ man filelength
No manual entry for filelength



Martin Moller Peders~ (16-06-2003)
Kommentar
Fra : Martin Moller Peders~


Dato : 16-06-03 15:35

In <bckj9m$5lt$1@news.net.uni-c.dk> "Rasmus Christian Kaae" <kaaeHEJ@VENdaimi.au.dk> writes:

>> Kunne som sagt ikke huske hvad den hed - den hedder filelength...
>>
>> i <io.h> filelength(fileno(f)); //hvor f er en FILE*

>[kaae@horse02]$ man filelength
>No manual entry for filelength

blad5/usr/lib> find /usr/include/ -type f -name io.h
blad5/usr/lib>

Saa io.h findes slet ikke.

/Martin



Rasmus Christian Kaa~ (16-06-2003)
Kommentar
Fra : Rasmus Christian Kaa~


Dato : 16-06-03 15:39

> >[kaae@horse02]$ man filelength
> >No manual entry for filelength
>
> blad5/usr/lib> find /usr/include/ -type f -name io.h
> blad5/usr/lib>
>
> Saa io.h findes slet ikke.

Nej, ergo. er det ikke en plausibel løsning.



Michael Rasmussen (17-06-2003)
Kommentar
Fra : Michael Rasmussen


Dato : 17-06-03 08:47


"Rasmus Christian Kaae" <kaaeHEJ@VENdaimi.au.dk> wrote in message
news:bckkp7$648$1@news.net.uni-c.dk...
> > >[kaae@horse02]$ man filelength
> > >No manual entry for filelength
> >
> > blad5/usr/lib> find /usr/include/ -type f -name io.h
> > blad5/usr/lib>
> >
> > Saa io.h findes slet ikke.
>
> Nej, ergo. er det ikke en plausibel løsning.
>
>

Tilgengæld ville det være rimeligt let at skrive en selv :)

long filelength(FILE* fp) /* ikke kompileret kode */
{
long pos = ftell(fp), len;
fseek(fp,0L,SEEK_END);
len = ftell(fp);
fseek(fp,pos,SEEK_SET);
return len;
}

- Michael Rasmussen



Igor V. Rafienko (17-06-2003)
Kommentar
Fra : Igor V. Rafienko


Dato : 17-06-03 11:50

[ Michael Rasmussen ]

[ ... ]

> Tilgengæld ville det være rimeligt let at skrive en selv :)


.... et forslag som tilgjengjeld ikke virker.





ivr
--
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?

Michael Rasmussen (17-06-2003)
Kommentar
Fra : Michael Rasmussen


Dato : 17-06-03 12:53

"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
news:xjvznkh7zc9.fsf@chiari.ifi.uio.no...
>
> ... et forslag som tilgjengjeld ikke virker.

lige bortset fra at der ikke er nogen error-checking, hvad fejler det så?

- Michael Rasmussen



Bertel Brander (17-06-2003)
Kommentar
Fra : Bertel Brander


Dato : 17-06-03 14:06

Michael Rasmussen wrote:
> "Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
> news:xjvznkh7zc9.fsf@chiari.ifi.uio.no...
>
>>... et forslag som tilgjengjeld ikke virker.
>
>
> lige bortset fra at der ikke er nogen error-checking, hvad fejler det så?
>
Tidligere i denne tråd skrev jeg:

Vær dog opmærksom på følgende note fra C-standarden:

"Setting the file position indicator to end-of-file, as with
fseek(file, 0, SEEK_END), has undefined behavior for a binary stream
(because of possible trailing null characters) or for any stream
with state-dependent encoding that does not assuredly end in the initial
shift state."

/b


Anders J. Munch (17-06-2003)
Kommentar
Fra : Anders J. Munch


Dato : 17-06-03 17:16

"Bertel Brander" <bertel@post4.tele.dk> wrote:
> Vær dog opmærksom på følgende note fra C-standarden:
>
> "Setting the file position indicator to end-of-file, as with
> fseek(file, 0, SEEK_END), has undefined behavior for a binary stream
> (because of possible trailing null characters) or for any stream
> with state-dependent encoding that does not assuredly end in the initial
> shift state."

Jeg formoder at den sætning stammer tilbage fra de onde gamle dage,
hvor filsystemer kunne have de mærkværdigste begrænsninger, og Niklaus
Wirth skabte Pascals I/O-system.

Jeg ville uden tøven bruge fseek(file, 0, SEEK_END), og checke
returværdien. Det skulle da være en ualmindeligt tåbelig
implementation der ikke bare stille og roligt returnerer en fejlkode,
hvis den ikke kan håndtere opgaven.

Man kan jo stipulere at det er et posix program, hvis koden absolut
skal følge en standard.

- Anders



Igor V. Rafienko (17-06-2003)
Kommentar
Fra : Igor V. Rafienko


Dato : 17-06-03 14:13

[ Michael Rasmussen ]

[ ... ]

> lige bortset fra at der ikke er nogen error-checking, hvad fejler
> det så?


Hmm... la oss se:

* Metoden takler ikke filer > 2^(sizeof(long)*CHAR_BIT-1)
* Metoden takler ikke filer som ikker er fseek'bare (fx. pipes)
* Metoden trenger ikke å virke i situasjoner påpekt av Bertel Brander
* Metoden takler ikke filer med "hull" i seg (ja, det er en søkt
problemstilling, men jeg prøver å illustrere et poeng her). Neppe et
problem for ID3 tags i mp3, men programmet bør kunne takle _hva som
helst_ av input (i motsetning til fx. å dø med SIGSEGV, bare
inputfilen er litt annerledes enn hva programmet var designet for).

Hvorfor ikke lese hele filen bytevis og ta være på de siste N bytes?
(Nettopp det med "first make it right, then make it fast").





ivr
--
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?

Michael Rasmussen (17-06-2003)
Kommentar
Fra : Michael Rasmussen


Dato : 17-06-03 16:17

"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
news:xjv4r2ox2x5.fsf@chiasso.ifi.uio.no...
> [ Michael Rasmussen ]
>
> [ ... ]
>
> > lige bortset fra at der ikke er nogen error-checking, hvad fejler
> > det så?
>
>
> Hmm... la oss se:

[snip en masse gode grunde]

ok, jeg "giver" mig.

- Michael Rasmussen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste