File I/O(fopen, fclose, fscanf)

C_Boy

Mitglied
Hallo,

Wenn wir hier das Programm anschauen, dass in eine File die Seiten und in die andere die Flaechen speichert(siehe 1. Programm).

Man könnte das ganze auch in Arrays schreiben oder? Dann bräuchte man kein "r".
(siehe 2. Programm).

Und dann bei fscanf(das liest ja Daten aus einer File). Kann es sein das fscanf nur ausliest wenn es sich in einen "Lese-Modus" befindet? Oder macht man das einfach so?
Also bei r, w+, a+....
Unterschied zwischen fscanf und "r" ist welcher?

MfG C_boy

1.Programm:
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
	FILE *Seiten=NULL;
	FILE *Flaeche=NULL;
	int i=0;
	int x=0;
	int a=0;
	int b=0;
	int ergebnis;

	

	Seiten = fopen("Seiten.csv","w"); 
	if(Seiten == NULL)  
	{
		printf("unable to write\n");
		exit(-1);
	}
	for(i=0; i <= 10; i++)
	{
		a=rand();
		b=rand();
		fprintf(Seiten,"%d;%d\n", a, b);
	} 
	fclose(Seiten);

	Seiten = fopen("Seiten.csv","r");
	if(Seiten == NULL)
	{
		printf("unable to read\n");
		exit(-1);
	}
  Flaeche = fopen("Flaeche.csv","w"); 
	if(Flaeche == NULL)  
	{
		printf("unable to write\n");
		exit(-1);
	}

	while(!feof(Seiten))
	{
		fscanf(Seiten,"%d;%d\n", &a, &b);
		printf("%d -> %d\n", a, b);
    ergebnis = a * b;
		fprintf(Flaeche,"ergebnis = %d\n\n", ergebnis);
	}
	fclose(Seiten);
	fclose(Flaeche);
	return (0);
}

2. Programm:
Code:
#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);
}
 
Zuletzt bearbeitet:
Hi

Zu dem "in Array schreiben": Ja, das wäre sogar die bessere Lösung.
Zuerst ein Array mit Zufallszahlen füllen, dann einmal in die Seiten-Datei schreiben und einmal das Multiplizierte in die Flächen-Datei, ohne die Seiten zuerst wieder auszulesen.

Zu fscanf: Ja, das kann/darf nur was einlesen, wenn die Datei zum Lesen (oder mit Kombinationen Lesen/Schreiben) geöffnet wurde.
Mit einem puren w oder a kann man nunmal nur neue Sachen reinschreiben, ohne den schon vorhandenen Inhalt einzulesen.

Zum Unterschied fscanf/r: Was meinst du jetzt genau damit?
r kan beim fopen angeben, um die Datei zum Lesen zu öffnen.
fscanf liest dann aus der geöffneten Datei tatsächlich was aus.

Gruß
 
Zurück