Article View: be.comp.programming
Article #4834Re: beginnersprobleem C onder Linux
From: KLinZ
Date: Mon, 30 Jun 2003 18:53
Date: Mon, 30 Jun 2003 18:53
126 lines
5145 bytes
5145 bytes
karel adams wrote:
> "KLinZ" <klinz@NOSPAMzenobitsSPAMNO.com> schreef in bericht
> news:kkzLa.14169$KF1.277597@amstwist00...
>> KLinZ wrote:
>>
>> Even een volledige recode:
>>
>> #include <stdio.h>
>>
>> int main () {
>> FILE *fp_bgl; /* file pointer to file being read */
>> int rd_cnt; /* will tell how many *items* were actually read
>> */ char header[128]; /* first 128 bytes in header */
>>
>> fp_bgl=fopen("de_naam_van_mijn_bestand", "r");
>> if(fp_bgl!=NULL) {
>> printf ("file opened with FP_BGL= %p\n", fp_bgl); /* op zich
>> weinig nuttige info */
>> rd_cnt=fread(header, sizeof(header), 1, fp_bgl);
>> printf ("Header has read %3d items\n", rd_cnt);
>> fclose(fp_bgl);
>> } else {
>> printf ("bestand kon niet geopend worden\n");
>> }
>>
>> return 0;
>> }
>>
>> Merk op dat fread niet het aantal gelezen bytes teruggeeft, maar het
>> aantal succesvol gelezen 'items'. Je kunt die waarde dus gebruiken
>> om te controleren of het lezen gelukt is.
>
>
> Bedankt hoor maar het werkt dus nog steeds niet.
> Het lezen van die FP_BGL is natuurlijk weinig relevant
> maar ik heb dat dus wel toegevoegd voor de debugging
> want dīŋŊīŋŊr gaat het mis
Nee, niet daar. Ik denk het op de fread() zelf mis gaat. Het openen van het
bestand lukt immers nog wel (fopen geeft immers een waarde ongelijk aan NULL
terug).
> met uw %p weergave krijg ik nu
>
> file opened wth FP_BGL=0x8049710
> header was read with -1 bytes
>
Een vreemde zaak. Met de bovenstaande code krijg ik de volgende output:
laamella:~/crap$ readhdr
file opened with FP_BGL= 0x80498a0
Header has read 1 items
Wat zijn de permissies van de file die je wilt lezen? Is het te lezen
bestand wel 128 bytes of groter? Post anders eens de exacte source zoals je
'm nu hebt. Of druk de waarvan van de variable 'errno' eens als volgt af:
#include <errno.h>
...
fread(...)
printf("%d", errno);
Deze waarde kan je meer vertellen over wat er precies fout is gegaan (man
errno).
> waarom wilt gij dat ik over 'items' klap en niet over bytes?
Omdat een item best 15 bytes kan zijn. Of 10. Of 10.000. Bekijk het
prototype van fread maar eens. Let goed op de beschrijving van de 2de
parameter. Maar van mij mag je 'item' ook best vervangen door 'record' of
'element' hoor ;-)
size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream);
> 'k vind dat zo microsnotterig, zo ontastbaar zweverig
oh, wel.
> en ik wil harde duidelijke data... bytes dus en geen items
Je kunt het aantal gelezen bytes altijd uitrekenen door rd_cnt te
vermenigvuldigen met sizeof(header).
laamella:~/crap$ man fread
Geeft mij:
<snipped>
DESCRIPTION
The function fread reads *nmemb* elements of data, each *size*
bytes long, from the stream pointed to by
stream, storing them at the location given by ptr.
The function fwrite writes nmemb elements of data, each size bytes
long, to the stream pointed to by
stream, obtaining them from the location given by ptr.
RETURN VALUES
fread and fwrite return the *number of items* successfully read or
written (i.e., *not* the number of charac-
ters). If an error occurs, or the end-of-file is reached, the return
value is a short item count (or
zero).
<snipped>
> maar of het nu items of bytes zijn: ik krijg er -1 van
> dus het gaat nog steeds niet en naar mijn gevoel
> is er iets loos met het type van die fp_bgl
> (aantal bits? signed/unsigned?)
fp_bgl? Dat is enkel de FILE pointer. Die geeft je '0x????????' terug. De
variabele rd_cnt bevat het aantal gelezen items. En in bovenstaand voorbeeld
is een (signed) int daar groot genoeg voor.
--
www.zenobits.com
Technical Details
Message-ID:
<FF%La.14453$KF1.300719@amstwist00>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-03!sn-xit-04!sn-xit-01!sn-xit-09!supernews.com!diablo.theplanet.net!newsfeed.icl.net!newsfeed.fjserv.net!skynet.be!skynet.be!213.51.129.3.MISMATCH!newshub1.home.nl!home.nl!amsnews01.chello.com!amstwist00.POSTED!not-for-mailReferences:
<bdmcmq$ttr34$1@ID-177484.news.dfncis.de> <41zLa.14163$KF1.277497@amstwist00> <kkzLa.14169$KF1.277597@amstwist00> <bdpoc3$vhg5u$1@ID-177484.news.dfncis.de>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,CP1252 X-Google-Thread: fcea4,6f05fc089e78a5f3 X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2003-06-30 11:52:27 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-03!sn-xit-04!sn-xit-01!sn-xit-09!supernews.com!diablo.theplanet.net!newsfeed.icl.net!newsfeed.fjserv.net!skynet.be!skynet.be!213.51.129.3.MISMATCH!newshub1.home.nl!home.nl!amsnews01.chello.com!amstwist00.POSTED!not-for-mail From: "KLinZ" <klinz@NOSPAMzenobitsSPAMNO.com> Newsgroups: be.comp.programming References: <bdmcmq$ttr34$1@ID-177484.news.dfncis.de> <41zLa.14163$KF1.277497@amstwist00> <kkzLa.14169$KF1.277597@amstwist00> <bdpoc3$vhg5u$1@ID-177484.news.dfncis.de> Subject: Re: beginnersprobleem C onder Linux Lines: 127 Organization: Inc. MIME-Version: 1.0 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 8bit X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1158 X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 Message-ID: <FF%La.14453$KF1.300719@amstwist00> Date: Mon, 30 Jun 2003 20:53:48 +0200 NNTP-Posting-Host: 212.187.71.152 X-Complaints-To: abuse@chello.nl X-Trace: amstwist00 1056999141 212.187.71.152 (Mon, 30 Jun 2003 20:52:21 MET DST) NNTP-Posting-Date: Mon, 30 Jun 2003 20:52:21 MET DST