|
| 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
| |
|
|