Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [Cat vervanger in C]Rare fout in While loop  (gelezen 971 keer)

Offline Joshua822

  • Lid
  • Steunpunt: Nee
[Cat vervanger in C]Rare fout in While loop
« Gepost op: 2009/07/19, 20:55:19 »
Hallo allemaal,

ik ben bezig met het schrijven van mijn eerste commando lijn hulpmiddel. Namelijk om een bestand uit te lezen, Dit is de code :

#include <stdio.h>

 int main(int argc, int argv[2]) {

  int check_eof;

  if ( !argc == 2 ) {

   printf("%s","U specifceerde geen bestand om uit te lezen.\n");
   return 1;

  }

  FILE *fptr = fopen( argv[1], "r" );

  while ( ( check_eof = fgetc( fptr ) ) !check_eof = EOF ) {

   printf("%s", check_eof);

  }
 }

Nu is het probleem als volgt, ik krijg van gcc steeds de volgende foutmelding :

readfile.c:16: error: expected ‘)’ before ‘check_eof’
Maar er staan naar mijn weten toch genoeg haakjes ?

O, en ik weet het, ik controleer nu nog niet of het bestand niet bestaat, maar dat zal ik nadat dit is opgelost wel even doen.

Alvast bedankt.

Offline profoX

  • Lid
    • wesley
    • Lionslink
  • Steunpunt: Nee
Re: [Cat vervanger in C]Rare fout in While loop
« Reactie #1 Gepost op: 2009/07/20, 00:07:12 »
Er zijn een aantal zaken mis met je code:

- tweede argument van int main moet char** zijn, dus "char **argv" of "char *argv[]" in plaats van "int argv[2]"
- als je netjes (volgens ANSI C) wil programmeren, mag je declaraties niet mixen met programmacode, wat betekent dat declaraties altijd bovenaan een blok moeten staan; in dit geval moet "File *fptr = blablabla;" dus voor of achter "int check_eof;" geplaatst worden
- de eigenlijke fout: de expressie in je while lus is misvormd... probeer dit in de plaats:
while (fgetc(fptr) != EOF) {
    printf("Not end of file yet...\n");
}
dat is korter en eenvoudiger; de check_eof variabele mag je dan eventueel ook weglaten
- hoewel het bij C++ weggelaten mag worden (maar ook is afgeraden omdat dit een slechte programmeerstijl is) moet in C élke functie, ook de main functie, een integer returnen, dus onderaan het programma is "return 0;" nog vereist (tenminste als je de ANSI C standaard wil volgen)

Al deze problemen zou de compiler automatisch voor je hebben gevonden als je compileert met de opties "gcc -Wall -ansi -pedantic file.c -o file"

Verder zijn er ook enkele problemen die de compiler niet vindt, namelijk:

- !argc == 2 is een foutief statement want !argc zal een boolean waarde teruggeven, welke je vervolgens probeert te vergelijken met een integer.. wat jij wil doen is: argc != 2

Met die verandering zou je programma moeten compileren en runnen. Succes.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline Joshua822

  • Lid
  • Steunpunt: Nee
Re: [Cat vervanger in C]Rare fout in While loop
« Reactie #2 Gepost op: 2009/07/20, 21:37:13 »
Bedankt voor de hulp.

Ik heb net de code afgerond, het geheel is nu net, en het werkt perfect.

#include <stdio.h>

 int main ( int argc, char *argv[] )
 {

  if ( argc != 2 )
  {

    printf("%s","U specificeerde geen bestand.");
    return 1;

  }

  FILE *fptr = fopen ( argv[1],"r" );

  if ( fptr == 0 )
  {

    printf("%s","Het bestand bestaat niet.");
    return 1;

  }

  int x;

  do {

   x = fgetc( fptr );

   if ( x != EOF )
   {
     printf("%c",x);

   }

  } while ( x != EOF );

  return 0;

 }

Deze code is vrije software, dus voel vrij om het te gebruiken en te verspreiden.


Offline profoX

  • Lid
    • wesley
    • Lionslink
  • Steunpunt: Nee
Re: [Cat vervanger in C]Rare fout in While loop
« Reactie #3 Gepost op: 2009/07/21, 00:03:53 »
Even een kleine opmerking: die if-test binnen de do-while-lus is overbodig als je een while-lus gebruikt:

int x;
while ((x = fgetc(fptr)) != EOF)
    printf("%c", x);

Toegegeven, de expressievoorwaarde in de while-lus is iets ingewikkelder op deze manier, maar je vermijd zo wel een stuk overbodige code.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)