Mit C .txt zeilenweise einlesen

Hi


leider habe ich nicht immer frei allso kann ich dir nicht immer helfen.....(zum glück gibt es noch andere Leute)

Achja die Schreibweise (fscanf(fh,"%s\n",&line) ist realtiv unsauber und der Compiler sollte auch meckern....... nimm das & bei line weg.......


Achja solltest du die Endung brauchen hier wäre was mit Endung....(habs etwas leicht modifiziert) Was jetzt noch fehlt ist die Abrage ob die Domain eine Endung besitzt oder nicht...... aber das überlasse ich jetzt dir da du auch noch lernen musst........

C:
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      int main(void) {
          FILE *fh;
          char line[80];
          char name[40], server[40];
	  char *endung;
          int merker;
	  fh = fopen("user.txt", "r");
	  
          while((fscanf(fh,"%s\n",line)) != EOF ) {

              //fprintf(stdout,"-> %s\n",line);
              if (sscanf(line, " %[^@]@%s", name, server) == 2) {
		
		 merker = strlen(server);
		while((server+merker)>= merker){

			if(server[merker] == '.') {

				server[merker] = '\0';
				endung = server+merker+1;
			}
		merker--;
		}
			                
		printf("[Found] Name: %s \t Server: %s  : %s\n",name,server,endung);
		endung = NULL;
              } else {
                  perror("line");
                  }
          }
          return EXIT_SUCCESS;
      }

Achja bitte als erledigt makieren.

mfg mike4004
 
Zuletzt bearbeitet:
Hi

habe es jetzt so verändert das es zeilen weiße ließt...

C:
#include <stdio.h>
#define LAENGE 100 //länger der einzelnen Zeilen
#define ANZAHL 10 //Anzahl der Zeilen


int main (void)
{
  FILE *datei;
  char line[ANZAHL][LAENGE];
   int i ;
  datei = fopen ("test.txt", "r");
  if (datei != NULL)
    {
	for(i = 0; i < ANZAHL;i++) {
 		//fseek(datei, i ,SEEK_SET);
		fgets(line[i],LAENGE,datei);  //zeilen weise lesen mit fgets...
		printf ("%i) %s\n",i ,line[i]);
	}
	fclose (datei);
    }

  return 0;
}

mfg mike4004

Moin...also ich hab das auch mal probiert. Ich verstehe nur eine sache nicht, wenn in meiner Datei so ausschaut:

Dann müsste ich doch für LAENGE 7 und für ANZAHL 2 definieren oder nicht? Weil bei mir kommt da nur "Zeile" raus. Ich blick das nicht so ganz. Könnte mir das vielleich jemand erklären?
Denn für meine Problem, weiß das Programm nich wie groß die Datei ist, deswegen muss ich das irgnedwie dynamisch machen. Hab da noch keinen Ansatz und müsste deswegen das erst einmal verstehen.

Mfg :)
 
fgets() hängt am Ende eines Strings noch ein \0 und wenn genug Platz vorhanden ist, auch noch ein \n an. Wenn du fgets() also 7 übergibst liest es 6 Zeichen ein und hängt noch ein \0 dran.
Sollten aber beispielsweise nur 5 Zeichen zum Einlesen vorhanden sein, so hängt fgets() ein \n und ein \0 an. Übergib fgets() 8 und es wird funktionieren.

Lg
 
Danke, das hab ich nicht beachtet.
Kleine Korrektur:
fgets kann nicht wissen, ob der String lang genug ist,
und je nachdem \n dazumachen oder weglassen.
Der Zeilenwechsel ist immer dabei
(falls in der Datei einer war, kann ja auch das Dateiende gewesen sein).


Ralf: LAENGE muss also 8 sein.
Wenn nicht wird Speicher überschrieben, der nicht zum String gehört.
Was dann passiert ist ziemlich unvorhersehbar.
 
Nur noch eine Frage jetzt: In meiner Textdatei steht:
hallo
hallo

Wenn ich jetzt das folgende Programm laufen lasse:

C++:
#include <stdio.h>

int main()
{
    FILE *quelle;
    char a[10];
    quelle = fopen ("hallo.txt", "r");
    if (!quelle)
    {
        return 1;
    }

    fgets (a, 5, quelle);

    printf ("%saaaaaaa", a);
    fclose (quelle);

}

Dann bekomme ich in der Ausgabe den Text und die ganzen a im printf() in einer Zeile. Deshalb dachte ich das mit dem \n weglassen.

Lg
 
Ach so, falsch verstanden.
Das ist natürlich richtig so, per Parameter auf 5 Zeichen begrenzt.
\n wäre das Sechste, also nicht dabei.
 
Ich rede jetzt aber nicht vom \n in der Textdatei. Ich meine, dass hier von fgets() nur das \0 angehängt wird, das \n nicht. Oder habe ich dich jetzt falsch verstanden?
 
Heute versteht jeder den anderen nicht :D

Das \0 muss ja dazu, weill die ganzen Stringfunktionen das Ende sonst nicht erkennen.

Zuerst hats sich nur so angehört, als würde fgets selbst ermitteln,
wie viel rein darf, und je nach Bedarf \n weglassen...
 
Jep, das funktioniert nun danke...:)
Kann mir jemand sagen wie ich die Anzahl der Zeilen rausfinde? Durch googlen hab ich einfach keine Lösung gefunden und selber bekomme ich das einfach nicht hin....:/
 
Zurück