🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #4834

Re: beginnersprobleem C onder Linux

#4834
From: KLinZ
Date: Mon, 30 Jun 2003 18:53
126 lines
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-mail
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>

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