File Input/Output

Googlehupf

Erfahrenes Mitglied
Hallo zusammen,

ich hab hier mal ne Frage:

Die Aufgabenstellung lautet:
1. Ein Unterprogramm um die Zeilen in einem File zu zählen und ans
Hautptprogramm zurueck zugeben. Ausgabe im Hauptprogramm.
Übergabeparameter: char filename[]
Rückgabeparameter: int


1. Ein Unterprogramm um die Zeilen im File durchzusuchen und alle Zeilen die
mit einem # beginnen in ein neues File mit dem Namen "komment.txt"
zu schreiben.
Übergabeparameter: char filename[]
Rückgabeparameter: ---

Es hat auch geheißen das man den Namen der Files übergeben muss.

C++:
char filename[20]="2bhel10_test3.txt";
//und
char filename1[20]="komment.txt";

Was bringt das wenn ich das so mache? Das heißt ja z.B das an der 0. Stelle eine 2 steht bei filename[20].
Was hat das für nen Sinn? Was mach ich da genau, wenn ich sowas mache?

MfG Googlehupf

Hier das funktioniernde Programm:
C++:
#include <stdio.h>
#include <stdlib.h>

#define MAXSTRLEN 40

/* unterprogramm zum zaehlen der zeilen
 * in: der dateiname der angabedatei
 * out: die anzahl
 */
int count(char filename[]);

/* unterprogramm zum suchen der zeilen, die mich einem # beginnen
 * in: der dateiname der angabedatei
 * out: ---
 */
void searchforhash(char filename[]);


int count(char filename[])
{
    int anzahl=0;   
    char temp[MAXSTRLEN];   
   
    FILE*fileio=NULL;   
    fileio=fopen(filename,"r");   
    if(fileio==NULL)   
    {
        printf("fehler beim einlesen!");
    }

    while(!feof(fileio))   
    {
        fscanf(fileio,"%s\n",&temp);   
        fflush(stdin);

        anzahl++;
    }

    fclose(fileio);   

    return(anzahl);   
}



void searchforhash(char filename[])
{
    char temp[MAXSTRLEN];   
    char filename1[20]="komment.txt";   
   
    FILE*fileio1=NULL;   
    FILE*fileio2=NULL;   

    fileio1=fopen(filename,"r");   
    if(fileio1==NULL)   
    {
        printf("fehler beim einlesen!");
    }

    fileio2=fopen(filename1,"w");   
    if(fileio2==NULL)
    {
        printf("fehler beim einlesen!");
    }

    while(!feof(fileio1))
    {
        fscanf(fileio1,"%s\n",&temp);   
        fflush(stdin);

        if(temp[0]=='#')   
        {
            fprintf(fileio2,"%s\n",temp);
        }
    }

    fclose(fileio1);
    fclose(fileio2);

    return;
}




int main(void)
{
    char filename[20]="2bhel10_test3.txt";   
    int anzahl1=0;   

    anzahl1=count(filename);
    printf("die anzahl ist: %d\n\n",anzahl1);

    searchforhash(filename);   


    return(0);
}
 
Hallo Googlehupf,

Wenn dein Übergabeparameter so aussieht:

C++:
char filename [20]="abc.txt";
function(filename);

Übergibst du eigentlich die Addresse des ersten Buchstaben. Da im Speicher hier alle Buchstaben hintereinander liegen, kommst du zu den restlichen Zeichen des Arrays. Folglich ist es das selbe, wenn du schreibst:

C++:
char filename [20]="abc.txt";
function(&filename[0]);

Ich persönlich bevorzuge aber die Zeiger variante, sieht dann so aus:

C++:
char *filename="abc.txt";
function(filename);

Prototyp:
void function(char *filename);
Googlehupf:
Das heißt ja z.B das an der 0. Stelle eine 2 steht bei filename[20].

Stimmt nicht ganz, es steht eine '2' bzw. die Zahl 50 drin. Ist alles das selbe, nur musst du unterscheiden ob du das Zeichen selbst, also '2' schreibst oder als Interpretation des Computers, die Zahl 50(dez) bzw. 32 (Hex) angibst.


Könntest du beim nächsten mal bitte deine Frage etwas exakter stellen? Ich verstehe nicht ganz, was du eigentlich wissen willst.

Grüße Poseidon
 
Aber mir wurde gesagt das man statt:
C++:
char filename[20]="2bhel10_test3.txt";
//und
char filename1[20]="komment.txt";

einfach
C++:
fileio=fopen("2bhel10_test3","r");
fileio2=fopen("komment.txt","w");

schreiben kann. Stimmt das? Bzw. Ich hab das jetzt umgeändert, aber ich weis net was ich dann bei den Parametern im Unterprogramm schreiben soll? Das es wieder funktioniert.

Hier das veränderte Programm:
C++:
#include <stdio.h>
#include <stdlib.h>

#define MAXSTRLEN 40	

/* unterprogramm zum zaehlen der zeilen
 * in: der dateiname der angabedatei
 * out: die anzahl
 */
int count(char filename[]);

/* unterprogramm zum suchen der zeilen, die mich einem # beginnen
 * in: der dateiname der angabedatei
 * out: ---
 */
void searchforhash(char filename[]);


int count(char filename[])
{
	int anzahl=0;	
	char temp[MAXSTRLEN];	
	
	FILE*fileio=NULL;	
	fileio=fopen(filename,"2bhel10_test3.txt","r");
	if(fileio==NULL)	
	{
		printf("fehler beim einlesen!");
	}

	while(!feof(fileio))	
	{
		fscanf(fileio,"%s\n",&temp);	
		fflush(stdin);

		anzahl++;	
	}

	fclose(fileio);	

	return(anzahl);	
}



void searchforhash(char filename[])
{
	char temp[MAXSTRLEN];	
	//char filename1[20]="komment.txt";	
	
	FILE*fileio1=NULL;	
	FILE*fileio2=NULL;	

	fileio1=fopen(filename,"2bhel10_test3.txt","r");	
	if(fileio1==NULL)	
	{
		printf("fehler beim einlesen!");
	}

	fileio2=fopen(filename1,"komment.txt","w");
	if(fileio2==NULL)	
	{
		printf("fehler beim einlesen!");
	}

	while(!feof(fileio1))	
	{
		fscanf(fileio1,"%s\n",&temp);
		fflush(stdin);

		if(temp[0]=='#')	
		{
			fprintf(fileio2,"%s\n",temp);	
		}
	}

	fclose(fileio1);	
	fclose(fileio2);

	return;
}




int main(void)
{
	//char filename[20]="2bhel10_test3.txt";	
	int anzahl1=0;	

	anzahl1=count(filename);	
	printf("die anzahl ist: %d\n\n",anzahl1);	

	searchforhash(filename);	

	return(0);
}
 
Hallo,

im Unterprogramm schreibst du (wie am Anfang):
Code:
  ... = fopen(filename, "r");
Beim Aufruf der Unterprogramme kannst du den Dateinamen-Text auch direkt als Parameter schreiben:
Code:
searchforhash("2bhel10_test3.txt");

Gruß
MCoder
 
Meinst du so? - Es geht net ganz.
C++:
#include <stdio.h>
#include <stdlib.h>

#define MAXSTRLEN 40	

/* unterprogramm zum zaehlen der zeilen
 * in: der dateiname der angabedatei
 * out: die anzahl
 */
int count("2bhel10_test3.txt");

/* unterprogramm zum suchen der zeilen, die mich einem # beginnen
 * in: der dateiname der angabedatei
 * out: ---
 */
void searchforhash("2bhel10_test3.txt");


int count("2bhel10_test3.txt")
{
	int anzahl=0;	
	char temp[MAXSTRLEN];	
	
	FILE*fileio=NULL;	
	fileio=fopen(filename,"2bhel10_test3.txt","r");
	if(fileio==NULL)	
	{
		printf("fehler beim einlesen!");
	}

	while(!feof(fileio))	
	{
		fscanf(fileio,"%s\n",&temp);	
		fflush(stdin);

		anzahl++;	
	}

	fclose(fileio);	

	return(anzahl);	
}



void searchforhash("2bhel10_test3.txt")
{
	char temp[MAXSTRLEN];	
	//char filename1[20]="komment.txt";	
	
	FILE*fileio1=NULL;	
	FILE*fileio2=NULL;	

	fileio1=fopen(filename,"2bhel10_test3.txt","r");	
	if(fileio1==NULL)	
	{
		printf("fehler beim einlesen!");
	}

	fileio2=fopen(filename1,"komment.txt","w");
	if(fileio2==NULL)	
	{
		printf("fehler beim einlesen!");
	}

	while(!feof(fileio1))	
	{
		fscanf(fileio1,"%s\n",&temp);
		fflush(stdin);

		if(temp[0]=='#')	
		{
			fprintf(fileio2,"%s\n",temp);	
		}
	}

	fclose(fileio1);	
	fclose(fileio2);

	return;
}




int main(void)
{
	//char filename[20]="2bhel10_test3.txt";	
	int anzahl1=0;	

	anzahl1=count(filename);	
	printf("die anzahl ist: %d\n\n",anzahl1);	

	searchforhash(filename);	

	return(0);
}
 
Hallo,

Habe deinen Code kurz überflogen und die schlimmsten Sachen ausgebessert und kommentiert.

C++:
#include <stdio.h>
#include <stdlib.h>
 
#define MAXSTRLEN 40    
 
	//nur Prototypen, keine Übergabestrings!
	//Hinweis: Prototypen sind dazu da, damit zu deine Unterprogramme unter die main schreiben kannst.
	//			Es wär sinnlos Prototypen anzugeben, wenn deine UPs sowieso ober der main stehen.

	/* unterprogramm zum zaehlen der zeilen
	 * in: der dateiname der angabedatei
	 * out: die anzahl
	 */
	int count(char filename[]);
 
	/* unterprogramm zum suchen der zeilen, die mich einem # beginnen
	 * in: der dateiname der angabedatei
	 * out: ---
	 */
	void searchforhash(char filename[]);

 
 
int count(char filename[])
{
    int anzahl=0;   
    char temp[MAXSTRLEN];   
    
    FILE*fileio=NULL;   
    fileio=fopen(filename,"r");				//siehe Syntax
    if(fileio==NULL)    
    {
        printf("fehler beim einlesen!");
		return -1;							//Würde Hier ein return -1; machen, da bei fclose in diesem Fall das Programm abstürzt
    }
 
    while(!feof(fileio))    
    {
        fscanf(fileio,"%s\n",&temp);    
        fflush(stdin);
 
        anzahl++;   
    }
 
    fclose(fileio); 
 
    return(anzahl); 
}
 
 
 
void searchforhash(char filename[])
{
    char temp[MAXSTRLEN];   
    			
    
    FILE*fileio1=NULL;  
    FILE*fileio2=NULL;  
 
    fileio1=fopen(filename,"r");					//das selbe wie oben 
    if(fileio1==NULL)   
    {
        printf("fehler beim einlesen!");
		return;										//siehe oben
    }
 			
    fileio2=fopen("komment.txt","w");				//kann auch übergeben werden wie filename[]
    if(fileio2==NULL)   
    {
        printf("fehler beim einlesen!");
		return;										//siehe oben
    }
 
    while(!feof(fileio1))   
    {
        fscanf(fileio1,"%s\n",&temp);
        fflush(stdin);
 
        if(temp[0]=='#')    
        {
            fprintf(fileio2,"%s\n",temp);   
        }
    }
 
    fclose(fileio1);    
    fclose(fileio2);
 
    return;
}
 
 
 
 
int main(void)
{
    //char filename[20]="2bhel10_test3.txt";    
    int anzahl1=0;
 
    anzahl1=count("2bhel10_test3.txt");				//oder filename das du wegkommentiert hast
    printf("die anzahl ist: %d\n\n",anzahl1);   
 
    searchforhash("2bhel10_test3.txt");				//oder filename das du wegkommentiert hast
 
    return(0);
}

Ob deine Unterprogramme funktionieren hab ich nicht getestet.

Grüße Poseidon
 
Ok, dieses fscanf leuchtet mir nocht nicht ein.
Ich muss aus einem Textdokument den Buchstaben und den jeweiligen Wert herauslesen und dann irgendwas Berechnen und in ein neues Textdokument rein.
Das vorgegebene Textdokument ist z.B so aus:
f 500
r 352
l 0,256
c 0,0015
l 0,456
r 358


C++:
fscanf(file1,"%c",&a);

Hier lese ich alles was im vorgegebenen Textdokument steht raus und speichere in einen Character a oder? Ich glaub das stimmt nicht, weil ein Character ist ja nur 1 Buchstabe?

C++:
if(a == 'f')
    {
      fscanf(file1,"%lf",&ff);
    }

Hier wenn a == f, dann liest es den dahinter stehenden Wert aus? Warum geht das fscanf nicht weiter hinunter in die nächste Zeile?

Hier wäre das Programm:

C++:
#include <stdio.h>

#define PI 3.14


int main()
{

  FILE * file1 = NULL;
  FILE * file2 = NULL;

  char a=0;
  double xl=0;
  double xc=0;
  double xr=0;
  double ff=0;
  double wertl=0;
  double wertc=0;
  double wertr=0;

  file1 = fopen("rlc.txt","r");
  if(file1 == NULL)
  {
    printf("Fehler beim Lesen!");
    exit(-1);
  }

  file2 = fopen("rlc2.txt","w");
  if(file2 == NULL)
  {
    printf("Fehler beim Schreiben!");
    exit(-1);
  }

  while(!feof(file1))
  {
    fscanf(file1,"%c",&a);

    if(a == 'f')
    {
      fscanf(file1,"%lf",&ff);
    }
    
    if(a == 'r')
    {
      fscanf(file1,"%lf",&wertr);
      fprintf(file2,"%lf\n",wertr);
      printf("%lf\n",wertr);
    }

    if(a == 'c')
    {
      fscanf(file1,"%lf",&wertc);
      xc=1/(2*PI*ff*wertc);
      fprintf(file2,"%lf\n",xc);
			printf("%lf\n",xc);
    }

    if(a == 'l')
    {
      fscanf(file1,"%lf",&wertl);
      xl=2*PI*ff*wertl;
      fprintf(file2,"%lf\n",xl);
      printf("%lf\n",xl);
    }
  }
  
  fclose(file1);
  fclose(file2);

  return(0);
}
 
Zurück