"?" aus Datei einlesen
-
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?
-
Hacker schrieb:
Swordfish schrieb:
Hacker schrieb:
Dankeschön, das lesen wir natürlich alles sofort.
wirklich!? 
Nein!

Aha. Das heißt also, ich sollte mein Codebeispiel, in dem das Problem auftritt, so kurz wie möglich halten, damit ich nicht unnötig mehr Zeit der evtl. hilfsbereiten Leser stehle, als nötig?

uerderli schrieb:
Trotz korrekter Vergleiche, die das ? immernoch als 0 gelesen.
Weißt ihr warum?
Nein, wir weissen es nicht.
-
uerderli schrieb:
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?
oh Gott, tschuldigung für meine Rechtschreibung
