"?" aus Datei einlesen



  • Hallo,

    ich möchte in einer Konsolenanwendung eine Datei einlesen, die folgende Form hat:

    2,1,7,0,16,-7,1,3,1,2,9,5,2,4,2,3,1,0,3,5,3,4,3,3,2,3,no
    1,13,2,1,14,-8,1,1,2,2,9,4,7,9,2,0,9,3,5,1,1,5,4,5,4,2,no
    2,12,2,0,16,-6,1,1,6,8,6,4,9,8,4,0,8,0,5,5,4,3,3,5,2,3,no
    2,6,1,0,15,-7,1,1,2,1,8,6,7,10,2,0,2,2,3,2,3,2,2,2,3,5,no
    2,9,8,0,16,-5,1,3,1,8,7,4,3,8,1,3,2,0,3,5,5,2,1,4,2,2,no
    2,12,1,1,14,-7,3,1,8,7,9,5,5,4,1,0,3,0,1,1,4,4,3,1,1,1,no
    2,1,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,no
    2,6,3,0,15,-3,3,2,7,2,6,7,5,8,2,6,3,3,5,4,2,5,3,4,5,1,no
    ...

    die ? bedeuten dabei einen fehlenden Wert.

    Mit
    token = strtok(zeile, separator);
    trenne ich dabei die Werte.
    Wenn ich jetzt ein Fragezeichen einlese, wird eine 0 eingelesen
    und token == "?" gibt false zurück.

    Wo ein ? hätte ich gerne eine Zahl außerhalb des Definitionsberechs(z.B. -42) in mein Array geschrieben statt eine 0.

    Kann ich beim Einlesen die ? irgenwie erkennen?
    vielen Danke für Antworten



  • uerderli schrieb:

    [...] und token == "?" gibt false zurück.

    ... == ist eine besch ... eidene Idee, Strings auf gleichheit zu prüfen.



  • Swordfish schrieb:

    uerderli schrieb:

    [...] und token == "?" gibt false zurück.

    ... == ist eine besch ... eidene Idee, Strings auf gleichheit zu prüfen.

    Ja, denn String-Literale und C-Strings sind nichts anderes als Zeiger, und nur wenn zwei Zeiger auf den Gleichen Speicherbereich verweisen sind sie "gleich".



  • ok, dann vergleiche ich die Strings mit:
    int strcmp(const char *pszS1, const char *pszS2)

    aber das ? wird ja immernoch als 0 eingelesen.



  • uerderli schrieb:

    ok, dann vergleiche ich die Strings mit:
    int strcmp(const char *pszS1, const char *pszS2)

    aber das ? wird ja immernoch als 0 eingelesen.

    Nein verdammt! Jetzt nimm C++-Strings statt C-Strings und mach es nochmal! Viertelstunde in die Ecke, sind wir hier im C- oder C++-Forum!? 😮 🙄
    Edit: Wenn dir C++-Strings zu unperformant sind...



  • Spinner.



  • @PI: Ma*l.
    @TE: Zeig mal ein wenig mehr Code, ich vermute du willst ins C-Forum... 🙄



  • Hacker schrieb:

    Swordfish schrieb:

    [...]

    [...]

    Danke für die Klarstellung... 🙄

    @OP: wie liest Du?



  • Swordfish schrieb:

    Hacker schrieb:

    Swordfish schrieb:

    [...]

    [...]

    Danke für die Klarstellung... 🙄

    Danke für deine nicht-existierende Erklärung, wieso der ==-Operator nicht sinnvoll ist. 😉



  • sorry,

    ich habe gerade nach
    c++ strings auf gleichheit überprüfen
    gegoogelt und die ++ wurden ignoriert und da hab ich strcmp gefunden.

    wie kann ich den sonst c++-strings vergleichen?
    In meinen C++ Buch steht, dass es mit == geht.



  • std::string Hallo("Hallo");///DAS
    std::string ZweitesHallo("Hallo");
    
    std::cout << ( (Hallo == ZweitesHallo) ? "Die Strings sind gleich" : "Die Strings sind nicht gleich") << "!\n";
    

    Das sind C++-Strings mit überladenen Vergleichs-Operatoren. Intern werden die Char-Arrays der beiden (wenn sie eines haben, was ich nicht genau weiß) Strings auf Gleichheit geprüft; wie, ist nicht dein Problem.



  • also ist doch mit == alles perfekt oder nicht?



  • uerderli schrieb:

    [...]
    In meinen C++ Buch steht, dass es mit == geht.

    Wenn es std::string s sind, stimmt das auch ...

    hint: char* sonstwas oder "foobar" sind keine std::string s ...



  • uerderli schrieb:

    also ist doch mit == alles perfekt oder nicht?

    Aber nicht bei Zeigern. Da müsstest du diese zuerst dereferenzieren, und nicht mal das klappt - wenn du folgendes machst:

    *"Hallo Welt!"
    

    ist das Ergebnis 'H'. String-Literale sind nähmlich eigentlich char-Pointer mit Null-Terminatoren.

    "Hal" :
    
    0x65464ea      73   //Oder so ähnlich; ASCII-, bzw. ANSI-Werte
    0x65464eb      97
    0x65464ec      109
    0x65464ed      0
    


  • so hier mal mein Code

    #include "stdafx.h"
    
    #include <iostream>
    #include <fstream>
    #include <string>
    
    #define num 9658
    #define att 27
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	ifstream datei("auf.txt");
    
    	if(!datei)
    	{
    		cerr << "Fehler beim Öffnen";
    		cin.get();
    		return 2;
    	}
    
    	//int* tap;
    	int (*tab)[att] = new int[num][att];
    	char zeile[70];
    	char separator[] = ",";
    	char* token;
    	int z = 0, s = 0;
    	datei.getline(zeile, 70);
    	while( datei.getline(zeile, 70))
    	{
    		s = 0;
    		token = strtok(zeile, separator);        /* erstes Token ermitteln */
    		while( token != NULL )
    		{
    			//if(token != "no" || token != "yes" || token != "?")
    			if(strcmp(token, "no") != 0 || strcmp(token, "yes") != 0 || strcmp(token, "?") != 0)
    			{
    				tab[z][s] = atoi(token);
    				cout << tab[z][s] << " | ";
    			}
    			else
    			{
    				if(token == "no")
    					tab[z][s] = 0;
    				else
    				if(token == "yes")	
    					tab[z][s] = 1;
    				else
    				if(token == "?")
    					tab[z][s] = -42;
    			}
    			token = strtok(NULL, separator);        /* weitere Token ermitteln */
    			++s;
    		}
    		//cout << endl << z << " geschaft" << endl;
    		//cin.sync();
    		//cin.get();
    		++z;
    	}
    
    	cout << "Dateneinfelsen abgeschossen" << endl;
    
    	//double* tab2;
    	double (*tab2)[num] = new double[num][num];  //Distanzmatrix
    
    	double diff;
    	double sum;
    
    	for(int i = 0; i < num -1; ++i)
    	{
    		for(int j = i+1; j < num; ++j)
    		{
    			sum = 0;
    			for(int k = 0; k < att - 1; ++k)  //cancerler nicht
    			{
    				if(tab[i][k] == -42 || tab[j][k] == -42)
    					diff = 0;
    				else
    					diff = tab[i][k] - tab[j][k];
    				sum += diff * diff;
    			}
    			tab2[i][j] = sqrt(sum);
    			//cout << endl << i << " " << j << " " << tab2[i][j] << endl;
    			//cin.sync();
    			//cin.get();
    		}
    	}
    
    	cout << "Distanzen berechnet" << endl;
    
    	double* tab3 = new double[num]; //Mittelwerte der Distanzwerte
    
    	double sum2 = 0;
    
    	for(int i = 0; i < num; ++i)
    	{
    		sum = 0;
    		for(int j = 0; j < num; ++j)
    		{
    			if(i == j)
    				sum += 0;
    			else
    			if(i < j)
    				sum += tab2[i][j];
    			else
    				sum += tab2[j][i];
    		}
    		tab3[i] = sum / (num -1);
    		sum2 += tab3[i];
    		//cout << endl << i << " " << tab3[i] << endl;
    		//cin.sync();
    		//cin.get();
    	}
    
    	double median = sum2 / num;
    
    	cout << "Mittelwerte gebildet" << endl;
    
    	//cout << median;
    	int a = 0;
    
    	ofstream outFile("auf2.txt", ios::app);
    
    	if(!outFile)
    	{
    		cerr << "Fehler beim Öffenen zum Schreiben" << endl;
    		cin.get();
    		return 2;
    	}
    
    	for(int i = 0; i < num; ++i)
    	{
    		if(abs(tab3[i] - median) > 8)
    		{
    			++a;
    			cout << i << endl;
    		}
    		else
    		{
    			for(int j = 0; j < att; ++j)
    			{
    				//if(tab[i][j] < -100)
    					//cout << i << " " << j << endl;
    				if(tab[i][j] == -42)
    					outFile << "?";
    				else
    				if(j == (att - 1) && tab[i][j] == 0)
    					outFile << "no";
    				else
    				if(j == (att - 1) && tab[i][j] == 1)
    					outFile << "yes";
    				else
    					outFile << tab[i][j];
    
    				outFile << ",";
    			}
    			outFile << endl;
    		}
    	}
    
    	cout << endl << a;  //265
    
    	cin.sync();
    	cin.get();
    	return 0;
    }
    

    Warum werden die ? als 0 interpretiert?
    Ist es wegen der Vergleiche mit c-strings oder kann generell ein ? nicht eingelesen werden, weil es ein Sonderzeichen ist



  • Dankeschön, das lesen wir natürlich alles sofort.



  • gibt es die Funktion strtok auch für C++-Strings?



  • uerderli schrieb:

    gibt es die Funktion strtok auch für C++-Strings?

    boost::algorithm::split oder ähnliches...



  • Hacker schrieb:

    Dankeschön, das lesen wir natürlich alles sofort.

    😮 wirklich!? 😃



  • Swordfish schrieb:

    Hacker schrieb:

    Dankeschön, das lesen wir natürlich alles sofort.

    😮 wirklich!? 😃

    Nein! 😃 😃



  • danke für eure Hilfe mit den String-Vergleichen.

    Aber nochmal zu dem ?.
    Trotz korrekter Vergleiche, die das ? immernoch als 0 gelesen.

    Weißt ihr warum?


Anmelden zum Antworten