File I/O (Input/Output)

Googlehupf

Erfahrenes Mitglied
Hallo,

ich hab ein Problem.
Aufgabenstellung etc. steht im Code als Comment.

Nur wenn ich bei "count_lines" schon bis zum Ende der Datei gehe.

Darum wird die while bei search_hash nicht berücksichtig, richtig?

Kann man das net irgenwie resetten?

C++:
/*Aufgabe:
   Schreiben Sie zwei Unterprogramme:
   a) Ein Unterprogramm um die Zeilen in einem File zu zählen und ans 
      Hautptprogramm zurueck zugeben. 

         
   b) Ein Unterprogramm um die Zeilen im File durchzusuchen und alle Zeilen die
      mit einem # beginnen in ein neues File.
      zu schreiben.
*/

#include <stdio.h>

#define MAX_LEN 100

int count_lines(FILE* text, FILE* erg);
void search_hash(FILE* text, FILE* erg);


int count_lines(FILE* text, FILE* erg)
{
  int anz=0;

  char a[MAX_LEN];

  while(!feof(text))
  {
    fgets(a,MAX_LEN,text);
	anz++;
  }

  return(anz);
}

void search_hash(FILE* text, FILE* erg)
{
  char b[MAX_LEN];

  while(!feof(text))
  {
    fgets(b,MAX_LEN,text);

    if(b[0] == '#')
	{
	  fprintf(erg,"%s",b);    
	}
  }
}

int main()
{
  FILE*text=NULL;
  FILE*erg=NULL;

  int anz=0;

  text=fopen("text.txt","r");
  if(text == NULL)
  {
    printf("fehler beim lesen(text.txt)");
	exit(-1);
  }

  anz=count_lines(text,erg);

  erg=fopen("erg.txt","w");
  if(erg == NULL)
  {
    printf("fehler beim schreiben(erg.txt)");
	exit(-1);
  }

  search_hash(text,erg);

  fclose(text);
  fclose(erg);

  return(0);
}

MfG Googlehupf
 
Hi

Warum heißt die eine Funktion search_hash? Wo ist da der hash?

Was macht count_lines mit Zeilen, die länger als 100 sind?
search_hash genauso.

Bei der "Fehler bei schreiben"-Meldung sollte die Lesedatei im if wieder geclosed werden.

Zum resetten:
C++:
fseek(text, 0, SEEK_SET);

Gruß
 
Was wäre fflush(stdin)?

Das fseek von oben setzt die Stelle, an der gelesen wird, wieder an den Dateianfang.

fflush macht was ganz anderes: Bei irgendeinem Schreibvorgang, bei dem die Daten vom Betriebssystem zwischengespeichert werden, den Buffer leeren und wirklich rausschreiben.
Beispiel: Schreiben einer Datei.
Wenn es nur wenig Byte sind werden die von Windows zwischengespeichert, statt sofort auf die Festplatte geschrieben.
Beim fclose wird dann erst wirklich geschrieben. Mit fflush kann man das schon vorher erzwingen, ohne die Datei zu schließen.

Bei irgendeinem Eingabezeug (wie fscanf, scanf etc) hat fflush übrigens gar nichts zu suchen (!)
NUR bei Ausgabe (Bildschirm, Datei etc). Alles, was rausgeht..

Gruß
 
Ok, ich danke euch.

Dadurch das ich noch Fragen habe... stelle ich sie hier gleich.

Mein Problem ist, dass ich in der letzten Zeile kein '\n' befinden, kann ich auch nicht die Summe von den Zahlen, Buchstaben mit einer # ausgeben.

Da gibt es einen Trick mit dem Return Value von fscanf oder?

Wenn kein Feld eingelesen werden kann das is der Rückgabewert 0 und sonst 1 oder?

C++:
/*Aufgabe:
   Schreiben Sie zwei Unterprogramme:
   a) Ein Unterprogramm um zeilenweise eine Kontrollzahl zu errechnen
      und diese Zahl am Ende der Zeile einzufügen.
      Die Kontrollzahl ist die Summe aller ASCII-Codes in der Zeile ohne die Leerzeichen.
      Die Zahl soll am Ende der Zeile mit einem # getrennt ausgegeben werden.
      
      Hinweis! Verwenden Sie zum einlesen %c
      
   
   b) Ein Unterprogramm um alle Werte im File auf mm umzurechnen und am Bildschirm auszugeben.

*/

#include <stdio.h>

#define MAX_LEN 100


void convert(FILE* text, FILE* erg);
void count_kontrollzahl(FILE* text, FILE* erg);


void convert(FILE* text, FILE* erg)
{
  char b[MAX_LEN];
  int a=0;
  int erg1=0;

  while(!feof(text))
  {
    fscanf(text,"%d%s\n",&a,b);

	if((b[0] == 'm') && (b[1] == 'm'))
	{
	  erg1=a*1;
	  printf("%dmm\n",erg1);
	}

	if((b[0] == 'm') && (b[1] == '\0'))
	{
	  erg1=a*1000;
	  printf("%dmm\n",erg1);
	}

	if((b[0] == 'd') && (b[1] == 'm'))
	{
	  erg1=a*100;
	  printf("%dmm\n",erg1);
	}

	if((b[0] == 'c') && (b[1] == 'm'))
	{
	  erg1=a*10;
	  printf("%dmm\n",erg1);
	}
  }

  rewind(text);
}

void count_kontrollzahl(FILE* text, FILE* erg)
{
  char a='x';
  int x=0;
  int sum=0;

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

    if(a == '\n')
	{
	  a='#';
	  fprintf(erg,"%c%d\n",a,sum);
	}
	else
	{
	  fprintf(erg,"%c",a);
	}
    
	sum+=a;
  }
}


int main()
{
  FILE*text=NULL;
  FILE*erg=NULL;

  text=fopen("text.txt","r");
  if(text == NULL)
  {
    printf("fehler beim lesen(text.txt)");
	exit(-1);
  }

  convert(text,erg);

  erg=fopen("erg.txt","w");
  if(text == NULL)
  {
    printf("fehler beim schreiben(erg.txt)");
	exit(-1);
  }

  count_kontrollzahl(text,erg);

  fclose(text);
  fclose(erg);
}

LG Googlehupf
 
Zurück