vcf Datei Zeilenweise einlesen und in neue Dateien speichern



  • Hallo ich bin neu hier und programmiere auch noch nicht lange C, habe folgendes Problem:

    Ich habe von meinem alten Handy das ganze Telefonbuch als .vcf Datei auf meinen PC exportiert, wenn ich diese Datei öffne wird nur der erste Kontakt angezeigt, jetzt möchte ich jeweil immer 9 Zeilen auslesen und diese in einer jeweil neuen Datei abspeichern als .vcf Datei.

    Ich habe versucht dieses Problem zu lösen aber es Funktioniert nicht richtig, könnt ihr mir helfen? Eventuell auch einen anderen Ansatz zu Lösung des Problems?

    Hier noch der Code:

    #include <stdio.h>
    #define ANZAHL 9 //Anzahl der Zeilen
    
    int main (void)
    {
      FILE *datei;
      FILE *f;
      char line[ANZAHL][500];
      int i;
      int idx;
      int zeilenL;
      char c; 
      char TempText[ANZAHL];
      char aktText;
      char filename[]={""};
      datei = fopen ("Whole Phonebook.vcf", "r");
      if (datei != NULL)
      {
        for (idx = 0; idx < 50; idx++) 
        {
            sprintf(filename, "%idx .vcf",idx);
            f = fopen(filename,"w");
            for(i = 0; i < ANZAHL;i++) 
            {   
                //printf(fgets(line[i],500,datei));
                fputs(fgets(line[i],zeilenL,datei), f);
                //zeilen weise lesen mit fgets...
    
            }
            fseek(datei,9,SEEK_CUR);
            while( (c=getc(f)) != EOF) fputs(c,datei);  
            fclose (datei);    
        }
        fclose (datei);
      } 
      system("pause");
      return(0);
    }
    

    Gruß Marco



  • Hallo,
    wie kommst du denn auf jeweils 9 Zeilen? Hast du dir schon das Dateiformat angeguckt? http://de.wikipedia.org/wiki/VCard
    Du müsstest erstmal eine Art Parser für das betreffende Format schreiben.

    Zu deinem Code:

    char filename[]={""};

    das geht nicht, du musst eine Größe festlegen,
    z.B. char filename[1024];

    fseek(datei,9,SEEK_CUR);

    das bewegt den Dateizeiger um 9 Bytes, nicht um 9 Zeilen.

    Deine fopen/fclose Argumente und Häufigkeiten sind unausgewogen.
    Versuch doch erstmal die Daten der einzelnen Einträge einzulesen und in der Konsole anzuzeigen, bevor du sie in eine Datei schreibst.

    Gruß,
    B.B.



  • Big Brother schrieb:

    Hallo,
    wie kommst du denn auf jeweils 9 Zeilen? Hast du dir schon das Dateiformat angeguckt? http://de.wikipedia.org/wiki/VCard
    Du müsstest erstmal eine Art Parser für das betreffende Format schreiben.

    Zu deinem Code:

    char filename[]={""};

    das geht nicht, du musst eine Größe festlegen,
    z.B. char filename[1024];

    fseek(datei,9,SEEK_CUR);

    das bewegt den Dateizeiger um 9 Bytes, nicht um 9 Zeilen.

    Deine fopen/fclose Argumente und Häufigkeiten sind unausgewogen.
    Versuch doch erstmal die Daten der einzelnen Einträge einzulesen und in der Konsole anzuzeigen, bevor du sie in eine Datei schreibst.

    Gruß,
    B.B.

    ich komme auf 9 Zeilen weil meine Einträge alle nur 9 Zeilen haben.

    wie kann ich das denn sonst machen außer mit fseek, am besten wäre es wenn ich die zuvor eingelesenen 9 Zeilen lösche aber ich weiß nicht wie ich das machen soll. Habt ihr da eine Idee?

    Gruß Marco



  • Brauchst du nicht löschen, einfach weiter einlesen.



  • Big Brother schrieb:

    Brauchst du nicht löschen, einfach weiter einlesen.

    und wie mache ich das??

    einfach mit modulo 9 ??

    wie mache ich das, dass eingelesen wird bis es keine Zeilen mehr zum lesen gibt??

    Gruß Marco und danke für die schnellen Antworten



  • marcoz schrieb:

    ich komme auf 9 Zeilen weil meine Einträge alle nur 9 Zeilen haben.

    Das garantiert nicht, das es immer so bleibt. Die Datei sollte geparst werden.

    marcoz schrieb:

    und wie mache ich das??

    einfach mit modulo 9 ??

    wie mache ich das, dass eingelesen wird bis es keine Zeilen mehr zum lesen gibt??

    Den Zeilenzähler einfach nach jeder 9ten Zeile zurücksetzen.
    Bis zum Dateieinde:

    while (!feof(fp))
    


  • aber dann werden ja nur immer die ersten 9 Zeilen eingelesen, oder liest er dann einfach immer weiter??

    Gruß Marco



  • Wenn du den Zähler zurücksetzt dann bleibt ja der Dateizeiger unangetastet.

    int main() 
    { 
    	FILE* fp = fopen ( "test.txt", "rb" );
    	char* p = NULL;
    	char line[1024] = {0};
    	int n = 0; // Zähler
    
    	if ( fp == NULL )
    		return 1;
    
    	while (!feof(fp))
    	{
    		fgets ( line, sizeof(line), fp );
    		if ( ferror(fp) )
    			return eret(); // Lesefehler.
    		if ( NULL == ( p = strchr( line, '\n' )))
    		{
    			puts ("Zeile zu lang fuer Array, Einlesevorgang abgebrochen!");
    			// Hier alternativ eine zweite while Schleife einbauen, welche die Zeile
    			// bis zum Schluss, also bis zum '\n' Zeichen einliest.
    			break;
    		}
    		puts(line);
    		n++;
    		if ( n == 9 )
    		{
    			puts("Es wurden 9 Zeilen eingelesen. Zum Fortfahren Enter druecken.");
    			getchar();
    			n = 0;
    		}
    	}
    	fclose(fp);
    	return 0; 
    }
    


  • Und wo muss ich die 9 Zeilen in die neue Datei schreiben?

    Hier?:

    while (!feof(fp))
        {
            f = fopen(dateiCounter,"w");
            fgets ( line, sizeof(line), fp );
            fputs(line,f);
            if ( ferror(fp) )
                return eret(); // Lesefehler.
            if ( NULL == ( p = strchr( line, '\n' )))
            {
                puts ("Zeile zu lang fuer Array, Einlesevorgang abgebrochen!");
                // Hier alternativ eine zweite while Schleife einbauen, welche die Zeile
                // bis zum Schluss, also bis zum '\n' Zeichen einliest.
                break;
            }
            puts(line);
            n++;
            if ( n == 9 )
            {
                dateiCounter++;
                puts("Es wurden 9 Zeilen eingelesen. Zum Fortfahren Enter druecken.");
                getchar();
                n = 0;
            }
        }
    

    würde das so gehen?

    Gruß Marco



  • marcoz schrieb:

    Und wo muss ich die 9 Zeilen in die neue Datei schreiben?

    Du musst die Zeilen ja nicht unbedingt auf einmal in die Datei schreiben.
    zeilenweise genügt ja.

    marcoz schrieb:

    Hier?:
    würde das so gehen?

    Fang doch erstmal klein an, indem du dir z.B. den Inhalt einer Textdatei zeilenweise anzeigen lässt. Dann weißt du auch, an welcher Stelle du etwas hinzufügen musst und brauchst nicht zu raten.

    Gruß,
    B.B.



  • Das ist wahrscheinlich nicht das was du hören willst, aber vielleicht solltest du auf Python wechseln. Ist für sowas deutlich besser geeignet und du kriegst es trotz Vorsprung in Python schneller zu laufen als unter c.

    file = open("pfad/datei", "r")
    data = file.read()
    file.close()
    for line in data:
        #tu was mit der Zeile
        print line[0:9] #Namen ausgeben
    

Log in to reply