Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » File input/output(fopen, flcose....)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.05.2011, 09:57 Uhr
~Herr Gast
Gast


Hallo,

Hallo,

ich hab ein Programm das die Seiten in eine eigene File speichert und die sortierten(mit Bubble Sort) Flächen in eigene File speichert.

Ich weis noch immer nicht für was die Gesamte while da ist. Besonders das fscanf.
Wäre cool wenn ihr mir das ganze Programm erklärt(Das Bubble Sort, also das Unterprogramm ist mir schon klar nur die Zeilen erklären die was mit File input ouput zum tun haben: fopen, close, die while, fscanf.... )

PS: Könnt ihr mir ein paar einfache Übungen zum File input output nennen, die ich dann programmieren kann?

Danke im voraus!

MfG Herr Gast

Hier ist es:

C++:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_LEN 10

void sort(int a[],int laenge);

void sort(int a[],int laenge)
{
  int i=0;
  int n=0;
  int hilf=0;

  for(i=0; i < laenge - 1 ; i++)
    {
        for(n=0; n<laenge - i - 1; n++)
        {
            if(a[n+1] < a[n])
            {
                hilf = a[n];
                a[n] = a[n+1];
                a[n+1] = hilf;
            }
        }
    }
}

int main (void)
{
    FILE * iofile = NULL;
    FILE * iofile2 = NULL; //file pointer zeigt auf das file
    int i=0;
    int a=0;
    int b=0;
    int n=0;
    int flaeche[MAX_LEN]; // array mit fläche
    int hilf=0;                                    // Hilsvariable zum Sortieren

    srand (time (NULL)); // wenn man das nicht macht sind die zufallszahlen bei jedem mal debuggen gleich; wenn man das will muss man srand auskommentieren
  iofile = fopen("Seite.csv","w");
  if(iofile == NULL)
    {
    printf("fehler....");
        exit(-1);
    }

    for(i=0; i<MAX_LEN; i++)
    {
        a = rand () %100 + 1;
        b = rand () %100 + 1;
    fprintf(iofile,"%d;%d\n",a,b);
    }
  fclose(iofile);

    iofile = fopen("Seite.csv","r");
    if(iofile == NULL)
    {
        exit(-1);
    }
  iofile2 = fopen("Flache.csv","w");
  if(iofile2 == NULL)
    {
        exit(-1);
    }

    while( ! feof(iofile))  // eof = end of file; feof gibt zurück ob das file zuende ist-> ist das wahr; solange das file nicht zuende ist wird das file ausgeführt
    {
        fscanf(iofile,"%d;%d\n",&a,&b); // und vor a und b macht man dafür
        printf("%d; %d\n",a,b);
        fprintf(iofile2,"%d\n",a*b);
    }

    fclose(iofile2);
    fclose(iofile);

    iofile2 = fopen("Flache.csv","a+");
  if(iofile2 == NULL)
    {
        exit(-1);
    }

    printf("\n");
  
  i=0;
    while(!feof(iofile2))
    {
        fscanf(iofile2,"%d\n",&flaeche[i]);
        printf("%d\n",flaeche[i]);
        i++;
    }
  
  fprintf(iofile2,"\n");
    sort(flaeche,MAX_LEN/2); // sortiert nur die hälfe der zahlen wegen /2
  printf("\n");
    for(i=0; i<MAX_LEN; i++)
    {
        printf("%d\n",flaeche[i]);
        fprintf(iofile2,"%d\n",flaeche[i]);
    }
    fclose(iofile2);

}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.05.2011, 21:22 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von ~Herr Gast:

Ich weis noch immer nicht für was die Gesamte while da ist.

und ich hab leichte Schwierigkeiten zu verstehen, was Du damit sagen willst.


Zitat von ~Herr Gast:

Wäre cool wenn ihr mir das ganze Programm erklärt(Das Bubble Sort, also das Unterprogramm ist mir schon klar nur die Zeilen erklären die was mit File input ouput zum tun haben: fopen, close, die while, fscanf.... )

Das erwartest du doch wohl nicht ernsthaft, oder?
Das sollte entweder da erklärt sein, wo Du es her hast, also wahrscheinlich in Deinen Schul- oder Uniunterlagen. Ansonsten nimm ein Einsteigerlehrbuch der Sprache C oder die Onlinehilfe des Compilers, den Du verwendest.


Zitat von ~Herr Gast:

PS: Könnt ihr mir ein paar einfache Übungen zum File input output nennen, die ich dann programmieren kann?

Du kannst es in dem Programm ja einfach mal weglassen, und gucken was passiert...

Hans


P.S. Zum Schluss noch dieser Hinweis. (klick)
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.05.2011, 09:44 Uhr
Anonymos




Zitat:
und ich hab leichte Schwierigkeiten zu verstehen, was Du damit sagen willst.


Für was brauch ich so ne while und ein fscanf, wenn es doch mit for auch geht?

Ich meine das Programm was ich oben gepostet hab versteh ich gar nicht wegen den ganzen while und fscanf.
Aber das Programm das ich gleich posten werde mit der for ist viel viel leicht verständlicher für mich.

Aber trotzdem frag ich nochmal was es mit der while aufhat? Die zählt ja bis zum Ende von der File oder? Und fscanf liest bestimmte Daten aus einer File raus oder?

Hier das Programm mit For:

C++:


#include <stdio.h>
#include <stdlib.h>

#define MAX_ANZAHL 10

void sort(int fl[]);
void sort(int fl[])
{
  int hilf=0;
  int x;
int i;

for(x=0; x<MAX_ANZAHL; x++)
{
   for(i=0; i<MAX_ANZAHL-1; i++)
  {
    if(fl[i+1] < fl[i])
   {
     hilf=fl[i];
    fl[i]=fl[i+1];
    fl[i+1]=hilf;
   }
  }
}
}

int main()
{
  FILE*seiten = NULL;
FILE*flaeche = NULL;

int a[MAX_ANZAHL];
int b[MAX_ANZAHL];
int fl[MAX_ANZAHL];
int i;
int hilf;


seiten = fopen("seiten.csv","w");
  if(seiten == NULL)
{
   printf("unable to write");
  exit(-1);
}

for(i=0; i<MAX_ANZAHL; i++)
{
   a[i]=rand()%10;
  b[i]=rand()%10;
  fprintf(seiten,"%d ; %d\n",a[i],b[i]);
}
fclose(seiten);

seiten = fopen("seiten.csv","r");
  if(seiten == NULL)
{
   printf("unable to read");
  exit(-1);
}

flaeche = fopen("flaeche.csv","w");
if(seiten == NULL)
{
   printf("unable to write");
  exit(-1);
}
  
  for(i=0; i<MAX_ANZAHL; i++)
{
    fl[i]=a[i]*b[i];
    fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
    printf("flaeche: ; %d\n",fl[i]);
}
sort(fl);
for(i=0; i<MAX_ANZAHL; i++)
{
  fprintf(flaeche,"flaeche: ; %d\n",fl[i]);
  printf("%d\n",fl[i]);
  
}
  

fclose(seiten);
fclose(flaeche);

return(0);
}



Dieser Post wurde am 08.05.2011 um 09:47 Uhr von Anonymos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.05.2011, 22:12 Uhr
Hans
Library Walker
(Operator)


Hi,

so, wie Du daher kommst, müsste man eigentlich gemäss diesem Smiley vorgehen, und Dich ignorieren. Aber sei's drum.
Die Konstruktion mit while ist einfach eine andere Art von Schleifen. Während Du eine for-Schleife so schreiben kannst:

C++:
for (i=0; i<10; i++)
  { // tue irgendwas
  }


musst Du es bei der while-Schleife so machen:

C++:
i=0;
while (i<10)
   {       // tue irgendwas
     i++;  // nicht vergessen!
   }


Das ist das ganze Geheimnis.

Und ansonsten hast Du das Programm in der zweiten Version seines Sinnes beraubt, weil Du fast die ganze Dateibehandlung rausgeschmissen hast. Das ist nämlich der Zweck des Ganzen: den programmseitigen Umgang mit Dateien zu üben, wozu u.a. auch fscanf und fopen benötigt werden. Denn das erste Programm schreibt ja nicht nur die Dateien (seiten.csv und flaeche.csv) auf die Festplatte, sondern es liesst die Daten auch wieder, die es zuvor darein geschrieben hat. Das zweite Programm dagegen schreibt nur die Dateien, macht aber sonst nichts mehr damit.

Und noch etwas. Diese Konstruktion:

C++:
void sort(int fl[]);
void sort(int fl[])
{
  ....
}


ist Unfug! Wenn Du das Unterprogramm an dieser Stelle, also vor der main()-Funktion stehen lässt, kannst Du Dir die Zeile mit dem Semikolon am Ende sparen. Die ist dann sinnvoll und notwendig, wenn Du es vorziehst, dass das Unterprogramm im Text nach der main()-Funktion stehen soll, also so:

C++:
#include ...

void sort(int fl[]); // hier nötig, weil die eigentliche Funktion, d.h. der
                     // Funktionsrumpf hinter der main()-Funktion steht.

int main()
{
  // tue irgendwas
  return 0;
}

void sort(int fl[])
{
  // sortiere...
} // fertig mit sortieren


Wenn Dir dieser Stil lieber ist, dann brauchst Du die Zeile mit dem Semikolon am Ende, was man dann als Funktionsprototyp bezeichnet. Wenn Du die Funktion ( = Unterprogramm) aber gleich hinschreibst und dahinter erst main() folgt, brauchst Du keine Prototypen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 08.05.2011 um 22:24 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: