/ 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
fscanf med for få argumenter
Fra : Lars Stokholm


Dato : 14-11-04 19:02

Er det galt at skrive sådan her?

fscanf (filter, "#%[^\n]\n")

Jeg mangler jo et argument til at fylde det jeg har læst ind i, men sker
der noget ved det? Det virker tilsyneladende.

 
 
Bertel Brander (14-11-2004)
Kommentar
Fra : Bertel Brander


Dato : 14-11-04 20:47

Lars Stokholm wrote:

> Er det galt at skrive sådan her?
>
> fscanf (filter, "#%[^\n]\n")

Ja, det er galt, fra C-standarden:

7.19.6.2 The fscanf function
Synopsis
#include <stdio.h>
int fscanf(FILE * restrict stream,
const char * restrict format, ...);
Description
The fscanf function reads input from the stream pointed to by
stream, under control of the string pointed to by format that
specifies the admissible input sequences and how they are to
be converted for assignment, using subsequent arguments as
pointers to the objects to receive the converted input.
If there are insufficient arguments for the format,the behavior
is undefined. If the format is exhausted while arguments remain,
the excess arguments are evaluated (as always) but are
otherwise ignored.

> Jeg mangler jo et argument til at fylde det jeg har læst ind i, men sker
> der noget ved det? Det virker tilsyneladende.

Jeg ville ikke stole på at det virker, dvs. gør det du ønsker og ikke
andet; der findes ting der er udefineret ifølge standarden som man kan
tillade sig at se stort på (hvis man ved hvad man gør), dette er IKKE
et af disse tilfælde.

--
"I learned more from a three minute record
than I ever learned in school"
- Bruce Springsteen

Lars Stokholm (14-11-2004)
Kommentar
Fra : Lars Stokholm


Dato : 14-11-04 21:14

Bertel Brander skrev:

>> Er det galt at skrive sådan her?
>>
>> fscanf (filter, "#%[^\n]\n")
>
> Ja, det er galt, fra C-standarden:

Hvad gør jeg mon så? Jeg har en fil, hvor nogle linjer er kommentarer.
En sådan linje starter med #. Jeg bruger fscanf-kaldet til at skippe
over disse linje. Jeg kan jo godt sætte et argument på...

fscanf (filter, "#%[^\n]\n", &foo)

....men det er lidt åndsvagt når jeg ikke skal bruge det til noget. Jeg
har brug for at fscanf returnerer noget positivt, når det har læst en
kommentarlinje, så jeg kan skippe med:

if (fscanf (filter, "#%[^\n]\n", &foo))
continue;

....derfor kan jeg ikke bruge "#%*[^\n]\n", da den bare giver mig 0.

Jakob Nielsen (14-11-2004)
Kommentar
Fra : Jakob Nielsen


Dato : 14-11-04 21:39

> Hvad gør jeg mon så? Jeg har en fil, hvor nogle linjer er kommentarer.
> En sådan linje starter med #. Jeg bruger fscanf-kaldet til at skippe
> over disse linje. Jeg kan jo godt sætte et argument på...
>
> fscanf (filter, "#%[^\n]\n", &foo)
>
> ...men det er lidt åndsvagt når jeg ikke skal bruge det til noget. Jeg
> har brug for at fscanf returnerer noget positivt, når det har læst en
> kommentarlinje, så jeg kan skippe med:

Er der ikke noget med at man kan bruge * foran "selektoren" i ens streng?
Koder mest i c# nu, så jeg kan dårligt huske det, men der er da noget med at
man kan ignorere data... mener det er med prefix *.



Lars Stokholm (14-11-2004)
Kommentar
Fra : Lars Stokholm


Dato : 14-11-04 21:44

Jakob Nielsen skrev:

> Er der ikke noget med at man kan bruge * foran "selektoren" i ens streng?
> Koder mest i c# nu, så jeg kan dårligt huske det, men der er da noget med at
> man kan ignorere data... mener det er med prefix *.

Jo, det skrev jeg faktisk også, men jeg kan godt se det var lidt skjult
i resten af teksten. Jeg kunne bruge *, men det duer ikke fordi jeg har
brug for at fscanf returnerer noget ikke-nul når den læser en kommentar.
Den tæller ikke de tegn med den ignorerer.

Bertel Brander (14-11-2004)
Kommentar
Fra : Bertel Brander


Dato : 14-11-04 22:13

Lars Stokholm wrote:

> Jo, det skrev jeg faktisk også, men jeg kan godt se det var lidt skjult
> i resten af teksten. Jeg kunne bruge *, men det duer ikke fordi jeg har
> brug for at fscanf returnerer noget ikke-nul når den læser en kommentar.
> Den tæller ikke de tegn med den ignorerer.

Jeg tror jeg ville lave noget i stil med:

#include <stdio.h>

int main()
{
int ch;
if(fgetc(stdin) == '#')
{
do
{
ch = fgetc(stdin);
}
while(ch != '\n' && ch != EOF);
printf("A Comment");
}
else
{
printf("Not a Comment");
}

return 0;
}

--
"I learned more from a three minute record
than I ever learned in school"
- Bruce Springsteen

Lars Stokholm (14-11-2004)
Kommentar
Fra : Lars Stokholm


Dato : 14-11-04 22:52

Bertel Brander skrev:

> if(fgetc(stdin) == '#')

Tja, det er ikke så godt at jeg begynder at hive tegn ud, for hvis
linjen nu ikke var en kommentar, så har jeg læst et tegn fra en
"rigtig" linje.

Jeg kunne jo søge tilbage, men det gør det hele en del langsommere:

for (int line = 1; !feof (filter); line++)
{
if (fgetc (filter) == '#')
{
fscanf (filter, "%*[^\n]\n");
continue;
}
fseek (filter, -1, SEEK_CUR);
fscanf (filter, ...);
...
}

....og så er det knapt så pænt. ;)

Jakob Nielsen (15-11-2004)
Kommentar
Fra : Jakob Nielsen


Dato : 15-11-04 09:39

> Jo, det skrev jeg faktisk også, men jeg kan godt se det var lidt skjult
> i resten af teksten. Jeg kunne bruge *, men det duer ikke fordi jeg har
> brug for at fscanf returnerer noget ikke-nul når den læser en kommentar.
> Den tæller ikke de tegn med den ignorerer.

Ahhh! Ja, nu fandt jeg det. Det er da en trøst at jeg huskede korrekt trods
alt



Bertel Brander (14-11-2004)
Kommentar
Fra : Bertel Brander


Dato : 14-11-04 21:57

Jakob Nielsen wrote:
> Er der ikke noget med at man kan bruge * foran "selektoren" i ens streng?
> Koder mest i c# nu, så jeg kan dårligt huske det, men der er da noget med at
> man kan ignorere data... mener det er med prefix *.
>

Det er rigtigt, man burde kunne bruge:

scanf("%*s");

* betyder at den scanner, men undlader assignment.

--
"I learned more from a three minute record
than I ever learned in school"
- Bruce Springsteen

Lars Stokholm (14-11-2004)
Kommentar
Fra : Lars Stokholm


Dato : 14-11-04 22:21

Bertel Brander skrev:

> * betyder at den scanner, men undlader assignment.

Ikke nok med det, den undlader også at tælle de tegn der læses, men
ignoreres, med i det tal der returneres (af fscanf).

Jeg har følgende:

for (int line = 1; !feof (filter); line++)
{
if (fscanf (filter, "#%[^\n]\n"))
continue;
fscanf (filter, ...); // Læser en ikke-kommenteret linje
...
}

....og det ser som sagt ud til at virke, men med det manglende argument
til fscanf. Hvis jeg sætter * ind i mit fscanf-kald, bliver 'continue'
aldrig udført, men det har jeg brug for at den gør.

Bertel Lund Hansen (14-11-2004)
Kommentar
Fra : Bertel Lund Hansen


Dato : 14-11-04 22:46

Lars Stokholm skrev:

>over disse linje. Jeg kan jo godt sætte et argument på...

> fscanf (filter, "#%[^\n]\n", &foo)

>...men det er lidt åndsvagt når jeg ikke skal bruge det til noget.

Det er da ikke åndssvagt at gå fra undefined behaviour til
welldefined behaviour?

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Lars Stokholm (14-11-2004)
Kommentar
Fra : Lars Stokholm


Dato : 14-11-04 22:59

Bertel Lund Hansen skrev:

> Det er da ikke åndssvagt at gå fra undefined behaviour til
> welldefined behaviour?

Det var heller ikke det jeg sagde, Bertel. Jeg sagde det var åndsvagt
at sætte et dummy-argument på.

Hvis jeg havde ment det var åndsvagt at gå til "welldefined behavior",
så havde jeg sagt tak efter Bertel Branders første svar.

Lars Stokholm (15-11-2004)
Kommentar
Fra : Lars Stokholm


Dato : 15-11-04 13:55

Lars Stokholm skrev:

> Hvad gør jeg mon så? Jeg har en fil, hvor nogle linjer er kommentarer.
> En sådan linje starter med #. Jeg bruger fscanf-kaldet til at skippe
> over disse linje.

Jeg er så heldig at ikke-kommenterede linjer har et bestemt format,
så jeg kan jo gøre sådan her:

for (int line = 1; !feof (filter); line++)
{
if (!fscanf (filter, ..., ...)) // "det bestemte format"
{
fscanf (filter, "%*[^\n]\n");
continue;
}
...
}

fscanf (filter, ..., ...) returnerer noget positivt, når der læses en
ikke-kommentar.

Tak til jer der forsøgte at hjælpe.

Søg
Reklame
Statistik
Spørgsmål : 177438
Tips : 31962
Nyheder : 719565
Indlæg : 6408040
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste