Einlesen einer .vcf datei und zerlegen des textes
-
Hallo zusammen,
ich bin neu zu c++ und mfc
Mein vorhaben:
Ich will mir ein Vcard datei einlesen und sie zerlegen und dann in ein editbox zuweisen.BEGIN:VCARD
N:Weidtmann;Muster;
FN: Muster Weidtmann
BDAY:
TEL;FAX:02222/22-2014
TEL;HOME:
TEL;CELL:
TEL;WORK:02222/22-2343
EMAIL;INTERNET:muster.weidtmann@dtest.com
ADR;WORK:;;Bonner Str. 122 ;Muss;;51389;Deutschland
ORG:Dtest GmbH, Muss;
TITLE:
END:VCARDsoll so zerlegt werden wie :
Name -> N
Vorname -> FN
Geburtstag -> BDAYund später in dem entsprechendes zugeordnet werden.
Irgendwie komme ich nicht weiter.. kann mir jemand mal helfen, bitte.
Das ist der code den ich bis jetz geschafft habe,
CString strFileName; // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen CFileDialog SampleDlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"vCard Datei(*.vcf)|*.vcf||"); int iRet = SampleDlg.DoModal(); strFileName = SampleDlg.GetPathName(); // Filepath mit Filename SetDlgItemText(IDC_File, strFileName); // ausgeben der filepath+filename in den IDC_File char str[1000], *token[80]; CString zeile; UINT nActual = 0; CStdioFile datei( strFileName, CFile::modeRead ); // Datei lesen int i = 0; while(datei.ReadString(zeile)> 0) { datei.ReadString(str,'\n'); //zeile = str; token[0] = strtok(str, ":"); while(token[i]!= NULL) { //ensure a pointer was found i++; token[i] = strtok(NULL, ":"); //continue to tokenize the string } int a; for(a = 0; a < 2; a++) { if(token[a] == "BDAY:"){ SetDlgItemText(IDC_OM, token[a+1]); } if(token[a] == "TEL;FAX:"){ SetDlgItemText(IDC_OM, token[a+1]); } if(token[a] == "TEL;HOME:"){ SetDlgItemText(IDC_OM, token[a+1]); } if(token[a] == "TEL;CELL:"){ SetDlgItemText(IDC_OM, token[a+1]); } } } datei.Close();
-
okay ich kaam schon weiter, falls es jemanden interessiert, hier ist der Code.
Ist noch nicht ganz fertig. Aber soweit funktioniert es bei mir.Vielleicht habt Ihr ja eine professionellere Lösungsvorschlag.
CString strFileName; // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen CFileDialog SampleDlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,"vCard Datei(*.vcf)|*.vcf||"); int iRet = SampleDlg.DoModal(); strFileName = SampleDlg.GetPathName(); // Filepath mit Filename SetDlgItemText(IDC_File, strFileName); // ausgeben der filepath+filename in den IDC_File char str[1000], *tokenz[20], *tokend[30]; CString m_strEdit1; UINT nActual = 0; CFile datei( strFileName, CFile::modeRead ); nActual = datei.Read( str, sizeof( str ) ); str[nActual] = 0; datei.Close(); m_strEdit1 = str; int i= 0; int x = 0; int y = 0; tokenz[0] = strtok(str, "\n"); while(tokenz[i]!= NULL) { i++; tokenz[i] = strtok(NULL, "\n"); //Trennen nach satz ende } for(int a = 0; a < 12; a++) { tokend[y] = strtok(tokenz[a], ":"); while(tokend[x]!= NULL) { x++; tokend[x] = strtok(NULL, ":"); //Trennen nach doppelpunkt } y = y + 2; } for(int z = 0; z < 30; z++) { CString actToken = tokend[z]; if(actToken == "N"){ SetDlgItemText(IDC_N1, tokend[z+1]); } if(actToken == "FN"){ SetDlgItemText(IDC_FN1, tokend[z+1]); } if(actToken == "BDAY"){ SetDlgItemText(IDC_BDAY1, tokend[z+1]); } if(actToken == "TEL;FAX"){ SetDlgItemText(IDC_TELFAX1, tokend[z+1]); } if(actToken == "TEL;HOME"){ SetDlgItemText(IDC_TELHOME1, tokend[z+1]); } if(actToken == "TEL,WORK"){ SetDlgItemText(IDC_TELWORK1, tokend[z+1]); } if(actToken == "TEL;CELL"){ SetDlgItemText(IDC_TELCELL1, tokend[z+1]); } if(actToken == "EMAIL;INTERNET"){ SetDlgItemText(IDC_EMAIL1, tokend[z+1]); } if(actToken == "ADR;;WORK"){ SetDlgItemText(IDC_ADRESSWORK1, tokend[z+1]); } if(actToken == "ORG"){ SetDlgItemText(IDC_ORG1, tokend[z+1]); } . . . . }
-
Ein Verbesserungsvorschlag: eine std::map<CString,UINT>, wo du die Tokens und die dazugehörige Dialog-Item-ID verknüpfst. Das Befüllen dieser Map kannst du in eine eigene Funktion auslagern. Macht die Sache insgesamt lesbarer, und falls zusätzliche Dinger dazukommen, einfach anfügen.