"?" 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::strings sind, stimmt das auch ...hint:
char* sonstwasoder"foobar"sind keinestd::strings ...
-
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?