Pointer in Array

jago-x

Grünschnabel
Hallo zusammen,

Ich benutze iTunes und wollte mal wissen, wie viele Stunden ich seit meiner Installation von iTunes Musik höre *gg*. Folgendener Aussschnitt aus der iTunes Library:
Code:
   ....
   ....
		<dict>
			<key>Total Time</key><integer>255712</integer>
			<key>Play Count</key><integer>1</integer>
			<key>Play Date</key><integer>-1065715521</integer>
			<key>PlayUTC</key><date>2006-04-30T12:22:5</date>
			<key>Track Type</key><string>File</string>
			<key>File Folder Count</key><integer>-1</integer>
			<key>Library Folder Count</key><integer>-1</integer>
		</dict>
   ....
   ....

Was ich benötige sind die zwei Zeilen *Total Time* -->255712uS und *Play Count*-->1. Diese Zahlen werden schlussendlich multipliziert und alle Ergebnisse addiert *mathegenie ^^*.
Mit der Funktion strstr(); bekomme ich den Zeiger, der mir auf das in Rot gekennzeichnete Symbol zeigt:
<key>Play Count</key><integer>1</integer>

Zu meiner eigentlichen Frage: Ich habe eine Varibale ptr, die mir auf das Zeichen *<* zeigt. Wie kann ich nun die restlichen Zeichen der jeweiligen Zeile ausgeben? Die Adresse im Pointer inkrementieren?..Mit meinem Code hat dies leider nicht funktioniert. Natürlich werde ich die Zeile später nicht ausgeben, soll nur ein Test sein obs funktioniert.
Code:
   ....
char teilstring_1[]="<key>Play Count</key><integer>";   
   ....
   ....
  while(fgets(string,sizeof(string),f)!=0)
   {
    if((pointer=strstr(string,teilstring_1))==NULL)
     printf("Falsche Zeile\n");
    else
    {
     while(*pointer!=NULL)
      {
       printf("%c",string[*pointer]);
       pointer++;
      }     
    } 
   ....
   ....

Ich hoffe es ist klar genug was ich meine, ansonsten fraage :)

Danke schon mal für eure Hilfe

Gruss j@gø
 
Zuletzt bearbeitet:
Hallo,

wieso verwendest du nicht sscanf?

C:
#include <stdio.h>

int main(){
    int play_count = 0;
    int total_time = 0;
    char* total_time_line = "<key>Total Time</key><integer>255712</integer>";
    char* play_count_line = "<key>Play Count</key><integer>1</integer>";
    sscanf(total_time_line, "<key>Total Time</key><integer>%d</integer>", &total_time);
    sscanf(play_count_line, "<key>Play Count</key><integer>%d</integer>", &play_count);
    printf("%d\n", total_time);
    printf("%d\n", play_count);
    return 0;
}

Gruß

RedWing
 
Hallo RedWing,

Danke erstmal für deinen Tipp. Sieht ja einiges schöner aus als meine Lösung. Ich wusste zwar dass man mit sscanf() strings in Zahlen Umwandeln kann, jedoch nicht, dass man einzelne Teile des Strings hearuskopieren kann.

d.h er koppiert beim %d dieser sscanf() Funktion
sscanf(total_time_line, "<key>Total Time</key><integer>%d</integer>", &total_time);
alles was zwischen <integer>......</integer> steht in die Variable total_time?..*cool* :)

DAnke für deine Hilfe

Gruss J@gø
 
Jap genau,

falls dich das mit der Zeile ausgeben doch intressieren sollte. Ja das geht
mit dem inkrementieren vom Pointer.
Vielleicht probierst dus mal so:
C:
   ....
   ....
  while(fgets(string,sizeof(string),f)!=0)
   {
    if((pointer=strstr(string,teilstring_1))==NULL)
     printf("Falsche Zeile\n");
    else
    {
     while(*pointer!='\0')
      {
       printf("%c",*pointer);
       pointer++;
      }     
    } 
   ....
   ....
Gruß

RedWing
 
Zuletzt bearbeitet:
Ah danke, ich werde es noch ausprobieren mit der Zeilenausgabe.
Was ich eigentlich noch fragen wollte ist, warum du beim Initialisieren der Charakter "char* total_time_line ..." einen Zeiger draus machst?...Mir ist nicht klar, warum der Compiler meckert, wenn ich folgendes schreib "char total_time_line...".

Somit wären meine Fragen geklärt, würde mich freuen wenn du mir noch diese eine erklären könntest, danke :-).

gruss
 
Hallo, kein Problem :)

Also pass auf:

Ein String ist ja eine Sequenz von einzelnen Zeichen. Diese werden
hintereinaner im Speicher abgelegt. Mit
char word = "Hallo" wird das nicht gehen da ein Variable vom Typ char
genau ein Zeichen aufnehmen kann und nicht mehr...

Also du hast 2 Möglichkeiten bei der Initialisierung eines "Character Arrays".

1.)
C:
char* word = "Hallo";
So mit legst du ein Character Array "Hallo" als Konstante im
Textsegment(Speicherbereich wo der Code liegt) ab. Um später noch
auf dieses Array zugreifen zu können, brauchst du natürlich irgendeine
Referenz auf dieses Array. Das machst du in dem du einen Zeiger drauf
zeigen läßt. So kannst du später mit bspw word[0] auf das Zeichen 'H'
zugreifen.

2.)
C:
char word[] = "Hallo";
das ist fast dasselbe, nur mit dem Unterschied das diesmal das Character
Array nicht im Codesegment abgelegt wird sondern direkt im
Datensegment, genauer auf dem Stackspeicher. Auch kann man diese Art
von Referenz (word) nicht einfach ändern:
C:
char content[] = "<dict>";
content = "Test"; //das geht in die hose!
im Gegensatz zu einem Zeiger. Dessen Wert kann man nämlich beliebig
verändern:
C:
    char* content = "<dict>"; //content besitzt den Wert der als Adresse auf "<dict>" zu interpretieren ist
    content = "Test"; //content besitzt nun den Wert der als Adresse auf "Test" zu interpretieren ist

Gruß

RedWing
 
Hallo

Danke vielmals für diese klare Beschreibung!! Ja, jetzt wird mir so einiges klar(er). Ich werde meinen Code in beiden Varianten morgen ausprobieren und dann mal schauen ;-).
Ich werde Bescheid geben obs funktioniert hat (falls es irgendjemanden da draussen interessiert *bigsmile*).

Tschüss & bis bald.

Gruss

J@gø.ch
 
Halli Hallo zusammen,

Dank RedWing hab ich nun auch mein halbwegs sinnloses Progrämmchen fertiggeschrieben :-). Klar besteht die Möglichkeit, noch weitere Feautures einzufügen. Mir gings hierbei nur um ein bisschen Übung, was ja wohl nicht schaden kann *g*.

Hier mein Code:
Code:
/*
  Name: Jan Göltenboth
  Datum: 06.05.06 09:46
  Beschreibung: iTunes: Erfassen der gesamten Musikspielzeit
*/

//***************HEADERDATEIEN*************************************************
#include <stdio.h>                                // printf, scanf
#include <conio.h>		           // getch();
#include <string.h>                               // String-Funktionen
#include <stdlib.h>                               // system("cls")

//***************FUNKTIONEN****************************************************
//********************Help*************************
void info()
{
 system("cls");
 printf("***********************************\n");
 printf("************** INFO ***************\n");
 printf("***********************************\n\n");
 printf("Programmierer:\tJan G\224ltenboth\n");
 printf("Datum:\t\t07.05.06 13:46\n");
 printf("Projekt:\tiTunes iTimes\n");
 printf("Version:\tV1.0\n\n");
 printf("\nERKL\216RUNG\n");
 printf("Das Mini-Tool *iTunes iTimes* gibt ihnen die Gesamtzeit\n");
 printf("ihrer bisher gh\224rten Musik mit iTunes aus. Die Daten werden\n");
 printf("aus der iTunes Library ausgelesen und verarbeitet.\n");
 printf("\nDie iTunes Library befindet sich normalerweis in folgendem Ordner:\n");
 printf("C:\\Dokumente und Einstellungen\\User\\Eigene Dateien\\Eigene Musik\\itunes\n\n\n");
 printf("Copyright by J@go\n");
 
 getch();
 system("cls");
}

//***************Gesamte Spielzeit******************
void zeit_total()
{
 char file_name[]="C:\\Dokumente und Einstellungen\\User\\Eigene Dateien\\Eigene Musik\\itunes\\iTunes Music Library.xml";  // Den Pfad muss man halt noch von hand reinschreiben *sniff*
 char *total_time_count_line[100];
 char *total_time_part="<key>Total Time</key><integer>";
 char *play_count_part="<key>Play Count</key><integer>";
 int play_count=0,time=0,total_time=0,check=0;
 FILE *f;
 
 f=fopen(file_name,"r");
 if(f==NULL)
  {
   printf("Konnte Datei %s nicht öffnen\n",file_name);
   exit(0);
  }   
 while((fgets(total_time_count_line,sizeof(total_time_count_line),f))!=0)
  {
//***************TIME [us]******************             
    if((strstr(total_time_count_line,total_time_part))!=NULL)
     {
         sscanf(total_time_count_line,"                        <key>Total Time</key><integer>%d</integer>",&time);
         check++;                                         
     }    
//***************COUNT*********************   
    if((strstr(total_time_count_line,play_count_part))!=NULL)
     {   
        sscanf(total_time_count_line,"                        <key>Play Count</key><integer>%d</integer>",&play_count);
        check=0;
        if(check<2)
        {
         total_time+=(time*play_count);
         check=0;  
        }       
     } 
  }
  printf("                   ____________________________________\n");
  printf("                  /  %d Mikrosekunden\t       \\\n",total_time);
  printf("                 |   %d \tSekunden\t\t|\n",(total_time/1000));
  printf("Totale Spielzeit |   %d \tMinuten\t\t\t\|\n",(total_time/60000));
  printf("                 |   %d \tStunden\t\t\t|\n",(total_time/3600000));
  printf("                 |   %d \tTage\t\t\t|\n",(total_time/86400000));
  printf("                  \\____________________________________/\n");
  fclose(f);
  getch();
  system("cls");
}
//***************MAIN**********************************************************
int main()
{
//Variablen-Konstanten deklarieren
char auswahl;
//***************EINGABE*******************************************************
do{
printf("***********************************\n");
printf("*********** iTunes-Tool ***********\n");
printf("***********************************\n\n");

printf("1 Gesamte Musikspielzeit erfassen\n");
printf("2 Info\n");
printf("3 Programm beenden\n");
auswahl=getch();
printf("\n");
switch(auswahl)
 {       
       case '1':
            zeit_total();
            break;
       case '2': 
            info();         
            break;
       default:{
                }                       
 }
}while(auswahl!='3'); 

}

Mein programm mag noch einige Unschönheiten oder vielleicht fehler beinhalten. Kritik ist willkommen :p ! Sowie zB. die Ausgabe der *Total gepsielten Zeit*, welche durch einen Integer *abgehackt* wird ;o). Mir schien der float so unsymphatisch ;) ....

Wer auf die Idee kommt mein Progrämmchen auszuprobieren, der sollte bei der Initialisierung den Pfad seiner eigenen iTunes Library reinschreiben. Meine ist nich deine :D

Grüsse

J@gø
 
Halli Hallo zusammen,

Dank RedWing hab ich nun auch mein halbwegs sinnloses Progrämmchen fertiggeschrieben :-). Klar besteht die Möglichkeit, noch weitere Feautures einzufügen. Mir gings hierbei nur um ein bisschen Übung, was ja wohl nicht schaden kann *g*.

Hier mein Code:
Code:
/*
  Name: Jan Göltenboth
  Datum: 06.05.06 09:46
  Beschreibung: iTunes: Erfassen der gesamten Musikspielzeit
*/

//***************HEADERDATEIEN*************************************************
#include <stdio.h>                                // printf, scanf
#include <conio.h>								  // clrscr();
#include <string.h>                               // String-Funktionen
#include <stdlib.h>                               // system("cls")

//***************FUNKTIONEN****************************************************
//********************Help*************************
void info()
{
 system("cls");
 printf("***********************************\n");
 printf("************** INFO ***************\n");
 printf("***********************************\n\n");
 printf("Programmierer:\tJan G\224ltenboth\n");
 printf("Datum:\t\t07.05.06 13:46\n");
 printf("Projekt:\tiTunes iTimes\n");
 printf("Version:\tV1.0\n\n");
 printf("\nERKL\216RUNG\n");
 printf("Das Mini-Tool *iTunes iTimes* gibt ihnen die Gesamtzeit\n");
 printf("ihrer bisher gh\224rten Musik mit iTunes aus. Die Daten werden\n");
 printf("aus der iTunes Library ausgelesen und verarbeitet.\n");
 printf("\nDie iTunes Library befindet sich normalerweis in folgendem Ordner:\n");
 printf("C:\\Dokumente und Einstellungen\\User\\Eigene Dateien\\Eigene Musik\\itunes\n\n\n");
 printf("Copyright by J@go\n");
 
 getch();
 system("cls");
}
//***************Gesamte Spielzeit******************
void zeit_total()
{
 char file_name[]="C:\\Dokumente und Einstellungen\\User\\Eigene Dateien\\Eigene Musik\\itunes\\iTunes Music Library.xml"; // den Pfad muss man halt noch von Hand reinschreiben *sniff*
 char *total_time_count_line[100];
 char *total_time_part="<key>Total Time</key><integer>";
 char *play_count_part="<key>Play Count</key><integer>";
 int play_count=0,time=0,total_time=0,i=0;
 FILE *f;
 
 f=fopen(file_name,"r");
 if(f==NULL)
  {
   printf("Konnte aus Datei %s nicht öffnen\n",file_name);
   exit(0);
  }   
 while((fgets(total_time_count_line,sizeof(total_time_count_line),f))!=0)
  {
//***************TIME [us]******************             
    if((strstr(total_time_count_line,total_time_part))!=NULL)
         sscanf(total_time_count_line,"                        <key>Total Time</key><integer>%d</integer>",&time); 
//***************COUNT*********************   
    if((strstr(total_time_count_line,play_count_part))!=NULL)
     {   
         sscanf(total_time_count_line,"                        <key>Play Count</key><integer>%d</integer>",&play_count);
         total_time+=(time*play_count);     
     } 
  }
  printf("                   ____________________________________\n");
  printf("                  /  %d Millisekunden\t       \\\n",total_time);
  printf("                 |   %d \tSekunden\t\t|\n",(total_time/1000));
  printf("Totale Spielzeit |   %d \tMinuten\t\t\t|\n",(total_time/60000));
  printf("                 |   %d \tStunden\t\t\t|\n",(total_time/3600000));
  printf("                 |   %d \tTage\t\t\t|\n",(total_time/86400000));
  printf("                  \\____________________________________/\n");
  fclose(f);
  getch();
  system("cls");
}
//***************MAIN**********************************************************
int main()
{
//Variablen-Konstanten deklarieren
char auswahl;
//***************EINGABE*******************************************************
do{
printf("***********************************\n");
printf("*********** iTunes-Tool ***********\n");
printf("***********************************\n\n");

printf("1 Gesamte Musikspielzeit erfassen\n");
printf("2 Info\n");
printf("3 Programm beenden\n");
auswahl=getch();
printf("\n");
switch(auswahl)
 {       
       case '1':
            zeit_total();
            break;
       case '2': 
            info();         
            break;
       default:{
                }                       
 }
}while(auswahl!='3'); 

}

Mein programm mag noch einige Unschönheiten oder vielleicht fehler beinhalten. Kritik ist willkommen :p ! Sowie zB. die Ausgabe der *Total gepsielten Zeit*, welche durch einen Integer *abgehackt* wird ;o). Mir schien der float so unsymphatisch ;) ....

Wer auf die Idee kommt mein Progrämmchen auszuprobieren, der sollte bei der Initialisierung den Pfad seiner eigenen iTunes Library reinschreiben. Meine ist nich deine :D

Grüsse

J@gø
 
Zuletzt bearbeitet:
Zurück