# Datei lesen int und string sortieren



## Thomasio (8. August 2006)

Ich hab da eine .txt, die sieht etwa so aus

123
abcd
45623
defr
blabla
11
usw

nun muss ich die Datei lesen, und dabei int und string aussortieren, so dass ich hinterher ein array mit ints und ein array mit strings habe
in jeder zeile steht immer entweder eine zahl oder ein string, anordnung und anzahl zeilen kann aber verschieden sein
mein problem ist nun, dass er mir alle zeilen als string liest, weil jede zeile mit \n endet
wie mache ich das?


----------



## jokey2 (8. August 2006)

Jede Dateizeile wird grundsätzlich als String gelesen, denn das ist es, was sie ist. Manche Strings kannman als Zahlen interpretieren. Dazu mußt Du testen, ob nur Ziffern im String enthalten sind oder nicht. Also den String von vorne nach hinten durchgehen und bei jecem Zeichen prüfen, ob es eine Ziffer ist. (Kleiner Tipp: Funktion isdigit(...) verwenden)


----------



## Thomasio (8. August 2006)

so weit so gut

(hab ich erwähnt, dass ich erst vor ein paar tagen angefangen habe zu lernen? dachte das wäre offensichtlich)

mit dem tip weiss ich mal, in welchen zeilen eine zahl steht
aaaaaaaaaaaaaaber
ich hab das ganze web durchwühlt nach "convert string int", bin 100ten von links gefolgt, nur kein einziger liefert mir ein brachbares ergebnis, auch hier im forum gibts keinen einzigen brauchbaren treffer zum thema (auch nicht wenn ich es in deutsch schreibe)

im prinzip sagen alle seiten die ich dazu finde das gleiche, ich brauche einen CString oder <sstream>, ich habe aber weder noch, mein GNU gcc liefert mir 100te von fehlern, ala undefined bzw. file not found wenn ich versuche da was zu includen
ich hab sogar in der FAQ von GNU eine <sstream> zum download gefunden, aber wenn ich die include bekomme ich gleich noch mehr fehler von weiteren files not found

ich bin schon fast geneigt mir n anderen compiler zu besorgen, aber irgendwie denk ich mir, das löst evtl mal dieses problem, nur dass ich danach vermutlich andere probleme haben werde
wer verrät mir denn wie ich das mit gcc machen kann, bzw was mache ich denn falsch hier? wenn in 100 webseiten keine einzige mein problem anspricht, denke ich mal ich bin der einzige depp im lande der das offensichtliche übersieht

gibts nicht irgendwas einfaches? so wie in php?
$integer = intval($string);
DAS wäre ne sache


----------



## Turri (9. August 2006)

Hallo,

hier kannst du dir abgucken wie du Zahlen aus einer Datei als Int verfügbar machst...
War letztens erst hier im Forum, les dir den Beitrag einfach mal durch...

Link

Ich denke das müsste anpassbar an dein Problem sein.

MfG Turri


----------



## jokey2 (9. August 2006)

Zum umwandeln kannst Du z.B. die C-Funktion atoi (= ascii to integer) verwenden:

```
int atoi( const char *string  );
```
 Wenn Du Fließkommazahlen hast, dann kannst Du auch atof (= ascii to float) verwenden

```
double atof( const char *string  );
```
 Damit kannst Du normale Dezimalzahlen umwandeln.
Wenn Du dann mal andere Schreibweisen hast (Expotentialschreibweise, Hexadezimalzahlen, Oktalzahlen), kannst Du sscanf verwenden.

```
int sscanf( const char *buffer,  const char *format [, argument ] ...  );
```


----------



## Thomasio (9. August 2006)

@ Turry, jockey,

danke für die antworten, von dem typ hab ich schon ein paar dutzend im web gefunden, löst nur leider nicht mein problem, wie ich schon in meinem letzten beitrag geschrieben hatte



> im prinzip sagen alle seiten die ich dazu finde das gleiche, ich brauche einen CString oder <sstream>, ich habe aber weder noch, mein GNU gcc liefert mir 100te von fehlern, ala undefined bzw. file not found wenn ich versuche da was zu includen
> ich hab sogar in der FAQ von GNU eine <sstream> zum download gefunden, aber wenn ich die include bekomme ich gleich noch mehr fehler von weiteren files not found


----------



## deepthroat (9. August 2006)

Hi.





			
				Thomasio hat gesagt.:
			
		

> @ Turry, jockey,
> 
> danke für die antworten, von dem typ hab ich schon ein paar dutzend im web gefunden, löst nur leider nicht mein problem, wie ich schon in meinem letzten beitrag geschrieben hatte


Erstmal solltest du uns verraten was du versuchst zu lernen. C oder C++? Welches Betriebssystem verwendest du? Wie sieht dein Code aus? Wie hast du ihn versucht zu kompilieren? Kurz: Was genau hast du gemacht?

Die Methoden um Dateien zu lesen und Strings in Integer zu konvertieren unterscheiden sich in beiden Sprachen doch erheblich - obwohl man in C++ auch die Methoden von C benutzen könnte.

Um C++ Programme mit GCC (GNU Compiler Collection) zu kompilieren, mußt du den g++ Compiler verwenden. Das gcc Frontend ist nur für C zuständig.

Gruß


----------



## Thomasio (9. August 2006)

was ich versuche zu lernen ist erstmal C, aber mit zielrichtung C++ und später Win32
dazu hab ich mir 2 fette bücher zugelegt und einige dutzend tutorials im web gesucht, die sind zwar als einzelne meist nicht besonders, aber sie ergänzen sich ganz gut, so dass ich mir den sinn aus einer kombination verschiedener tutorials rausklauben kann
zu anfang bin ich da etwas querbeet rumgehüpft, ein wenig C, dann wieder C++ und auch n paar sachen in Win32, habe aber inzwischen begriffen, dass ich mit C anfangen und mich da erstmal durcharbeiten muss

installiert habe ich mir CODE::BLOCKS, der wurde mir mehrfach empfohlen, und schaut mir auch recht gut aus
drin enthalten ist gcc und mingw, also alles was ich brauche

bis ich nu in einem meiner bücher auf diese übung gestossen bin, wo ich <sstream> brauche, was C:B aber nicht includen kann, zumindest hab ich nicht rausgefunden wie, bzw ich bekomme einen haufen fehlermeldungen
darum hab ich dann versucht das ganze von der eingabeaufforderung zu machen
damit habe ich mal den ersten teil der übung gelöst, in dem es drum ging die datei anzulegen, lesen und schreiben, indem ich mir aus einem der tutorials rausgesucht habe, wie man das mit funktionen macht, die in <stdio> enthalten sind, nur der zweite teil funktioniert damit nicht mehr, weil <stdio> wohl keine funktion hat string nach int zu wandeln, sprich ich brauche nun doch <sstream>
also stehe ich da mit dem kurzen hemd


----------



## Sakr (9. August 2006)

Hi

da du aus der dateien nur strings lesen kannst (klar im textdateien sind strings gespeichert),
sollst du die nachdem lesen umwandeln und getrennt speichern.

dafür habe ich für dich ein kleines beispiel geschrieben wie du aus einem array von strings integer werte und strings trennen kannst. das beispiel habe ich in C++ geschrieben, aber danach in C umgewandelt da ich bemerken habe dass du C benutzt (gcc frontend ist nur für C programme)


```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>



int main(){

	char *a[4] = {"34","ab","65","ghf"};  
	int b[2], j = 0, k = 0;
	char c[2][20];

	for(int i=0; i<4; i++){				
		if(atoi(a[i]))					
			b[j++] = atoi(a[i]);		
		else
			strcpy(c[k++], a[i]);			
	}
	
	for(int i = 0; i < 2; i++)
		printf("integer : %d string : %s\n", b[i], c[i]);
		
	return 0;

}
```

hoffe das kleines beispiel hilft weiter.
auslesen aus dem dateien und speicher allokieren überlasse ich dir . aber wenn du noch probleme damit hast denn erweitere ich es gern.


Mfg


----------



## Thomasio (9. August 2006)

hey klasse
heissen dank

ich melde mich dann mit dem nächsten problem, sobald ich kapiert habe was deine funtion da macht  

wenn mir in der zwischenzeit noch jemand erklären könnte, warum C::B sich weigert <sstream> zu includen, während sämtliche anfänger tutorials davon ausgehen, dass das selbstverständlich geht (zumindest wird mit keinem wort erwähnt, dass es probleme damit geben könnte) wäre mir erstmal geholfen

danke nochmal
Thomas


----------



## deepthroat (9. August 2006)

Thomasio hat gesagt.:
			
		

> was ich versuche zu lernen ist erstmal C, aber mit zielrichtung C++ und später Win32
> dazu hab ich mir 2 fette bücher zugelegt und einige dutzend tutorials im web gesucht, die sind zwar als einzelne meist nicht besonders, aber sie ergänzen sich ganz gut, so dass ich mir den sinn aus einer kombination verschiedener tutorials rausklauben kann
> zu anfang bin ich da etwas querbeet rumgehüpft, ein wenig C, dann wieder C++ und auch n paar sachen in Win32, habe aber inzwischen begriffen, dass ich mit C anfangen und mich da erstmal durcharbeiten muss


Gut, das du das jetzt erkannt hast. Dieses rumgehopse bringt nämlich nichts außer das du ganz verwirrt bist - was bereits der Fall zu sein scheint . Entscheide dich einfach für eine Sprache und versuche damit klar zu kommen. C ist allerdings nicht wirklich toll dafür weil man alles zu Fuß machen muß. 



			
				Thomasio hat gesagt.:
			
		

> installiert habe ich mir CODE::BLOCKS, der wurde mir mehrfach empfohlen, und schaut mir auch recht gut aus
> drin enthalten ist gcc und mingw, also alles was ich brauche


MinGW ist ein angepasster GCC für Windows.



			
				Thomasio hat gesagt.:
			
		

> bis ich nu in einem meiner bücher auf diese übung gestossen bin, wo ich <sstream> brauche, was C:B aber nicht includen kann, zumindest hab ich nicht rausgefunden wie, bzw ich bekomme einen haufen fehlermeldungen


Der Header sstream ist Teil der C++ Standard Template Bibliothek. Was du bei C::B inkludieren kannst oder nicht hängt vom dem installierten Compiler ab. Wenn du da nur den C Compiler von MinGW installiert hast und nicht den C++ Compiler und die C++ Bibliothek / Header, dann kannst du es auch nicht einbinden. Genauso wenig funktioniert es wenn du nur den C Compiler aufrufst, z.B. wenn die Datei nicht als C++ Datei (mit der Endung .cpp) gespeichert hast.



			
				Thomasio hat gesagt.:
			
		

> darum hab ich dann versucht das ganze von der eingabeaufforderung zu machen
> damit habe ich mal den ersten teil der übung gelöst, in dem es drum ging die datei anzulegen, lesen und schreiben, indem ich mir aus einem der tutorials rausgesucht habe, wie man das mit funktionen macht, die in <stdio> enthalten sind, nur der zweite teil funktioniert damit nicht mehr, weil <stdio> wohl keine funktion hat string nach int zu wandeln, sprich ich brauche nun doch <sstream>
> also stehe ich da mit dem kurzen hemd


Nein. Es gibt in stdio verschiedene Funktionen um Strings zu konvertieren. (siehe hier: http://cppreference.com/stdstring/index.html) Die Funktion atoi solltest du allerdings nur verwenden wenn du bereits sichergestellt hast, das es sich dabei um eine Zahl handelt, da die Funktion nicht auf Fehler prüft und z.B. "1abasd" auch als Zahl interpretiert wird.



			
				Sakr hat gesagt.:
			
		

> ```
> if(atoi(a[i]))
> ```


Diese Abfrage ist unsinnig, da im String durchaus ein Wert stehen könnte der 0 ergibt. Man kann mit atoi nicht auf Fehler prüfen sondern muß vorher erstmal feststellen ob der String als Zahl interpretiert werden kann. Oder man benutzt einfach sscanf:
	
	
	



```
int x; 
const char* wert = "1234"; 

if (sscanf(wert, "%i", &x) == 1) ...
```
Gruß

Und warum schreibst du den Code als Zitat?

@Thomasio: Bitte halte dich an die Groß-/Kleinschreibung, siehe Netiquette Nr. 15.

Gruß


----------



## Thomasio (9. August 2006)

Verwirrung ist wohl das richtige Wort, ich versuche gerade zu vergessen was ich zu Anfang schon über Win32 gelesen hatte, damit es nicht noch schlimmer wird bevor ich mal die Grundlagen kenne

Ob nun C oder C++, mein Ziel ist ohnehin Win32, wie ich da hin komme ist mir im Prinzip egal, mir ist nur aufgefallen, dass die allermeisten Tutorials für C++ schon Kenntnisse in C voraussetzen, darum bin ich nach der anfänglichen Verwirrung sozusagen "back to the roots"



> Der Header sstream ist Teil der C++ Standard Template Bibliothek. Was du bei C::B inkludieren kannst oder nicht hängt vom dem installierten Compiler ab. Wenn du da nur den C Compiler von MinGW installiert hast und nicht den C++ Compiler und die C++ Bibliothek / Header, dann kannst du es auch nicht einbinden. Genauso wenig funktioniert es wenn du nur den C Compiler aufrufst, z.B. wenn die Datei nicht als C++ Datei (mit der Endung .cpp) gespeichert hast.



Installiert habe ich ganz einfach das, was bei C::B auf der download Seite als letzte offizielle Release angeboten wird, wo gcc und mingw bereits enthalten ist (mit den "nightly builds" komme ich irgendwie nicht klar, wenn ich da versuche was zu installieren funktioniert hinterher gar nichts mehr)
Nach euren Tips hier habe ich gerade mal etwas herum experimentiert, was mein Problem evtl etwas deutlicher beschreibt:

Im Windows Editor einen mini Code geschrieben der praktisch nur <sstream> included, um zu sehen, ob es denn geht, dann in der Eingabeaufforderung direkt mingw aufgerufen ....... funktioniert, egal unter welchem Namen ich es speichere
In C::B eine neue Datei erstellt und den exakt gleichen Code reinkopiert ......... funktioniert nicht, egal ob ich es als .c oder .cpp speichere

mingw ist also wohl richtig installiert, nur dass in C::B irgendeine Einstellung nicht passt, oder woran sonst könnte es liegen?


----------



## Sakr (9. August 2006)

naja als ich vor lange zeit fast das gleich problem hatte, hatte ich es mit atoi() gelöst und hat wunderbar geklappt. 
aber die losung mit sscanf() ist viel besser .

PS : ich bin neu bei der forum deswegen habe ich den code in zitat geschrieben.


----------



## deepthroat (9. August 2006)

Thomasio hat gesagt.:
			
		

> Installiert habe ich ganz einfach das, was bei C::B auf der download Seite als letzte offizielle Release angeboten wird, wo gcc und mingw bereits enthalten ist (mit den "nightly builds" komme ich irgendwie nicht klar, wenn ich da versuche was zu installieren funktioniert hinterher gar nichts mehr)


Laut der C::B Seite sind in dem Standardpaket der C++ und C Compiler sowie die benötigten Pakete drin.



			
				Thomasio hat gesagt.:
			
		

> Im Windows Editor einen mini Code geschrieben der praktisch nur <sstream> included, um zu sehen, ob es denn geht, dann in der Eingabeaufforderung direkt mingw aufgerufen ....... funktioniert, egal unter welchem Namen ich es speichere
> In C::B eine neue Datei erstellt und den exakt gleichen Code reinkopiert ......... funktioniert nicht, egal ob ich es als .c oder .cpp speichere


Du "beschreibst". Warum? Warum postest du nicht einfach den konkreten Code und den genauen Befehl den du benutzt hast um die Datei zu kompilieren? Was ist die Ausgabe des Compilers im Log Fenster? Das wäre doch viel einfacher und läßt keinen Raum zur Spekulation.



			
				Thomasio hat gesagt.:
			
		

> mingw ist also wohl richtig installiert, nur dass in C::B irgendeine Einstellung nicht passt, oder woran sonst könnte es liegen?


Also ich hab grad C::B mal installiert. Der folgende Code wird ohne Probleme kompiliert und gelinkt wenn ich auf Build->Compile Current file klicke: 
	
	
	



```
#include <sstream>
#include <string>
#include <iostream>

int main() {
    std::istringstream istr("hello world");
    std::string s;
    while (istr >> s) {
        std::cout << s << std::endl;
    }
}
```
Hast du evtl. ein C Projekt statt eines C++ Projekts angelegt (falls du ein Projekt angelegt hast)?

Gruß


----------



## Thomasio (9. August 2006)

Ich sags ja, der einzige Depp im Lande der das Offensichtliche übersieht
Mit C++ source funktioniert es

danke an alle, ich melde mich in 1/2 Jahr wieder, wenn ich den Unterschied zwischen C und C++ begriffen habe


----------



## jokey2 (9. August 2006)

Bloß nicht verzweifeln!


----------

