# zahlen aus datei, in array eintragen (in programmiersprache c)



## maria1 (8. August 2010)

hallo alle zusammen,
also es geht darum:
ich möchte in eine txt datei, pro zeile, eine zahl mit oder ohne komma,+/-, eintragen z.b:
2.5
143.6
12
1.6
-3.1
diese sollen in meinem programm nun in ein array eingetragen werden..in der form array[0]=2.5,array[1]=143.6 usw.

dabei kommen mir schon vor der programmierung einige fragen auf:
1.wie kann ich eine !ganze! zeile immer in ein arrayfeld eintragen, mit vorzeichen...punkt usw.
2.oder muss man zeichen für zeichen einlesen
3.muss ich eine typumwandlung vornehmen?und wenn ja wie ****damit z.b. die 2.5 genauso erhalten bleibt wie sie ist, halt nur geschrieben in ein arrayfeld vom typ float

es wäre echt super wenn mir jemand auf diese fragen antworten könnte, ich hab schon internet komplett durchgesucht...erfolglos


----------



## sheel (8. August 2010)

Willkommen im Forum!

Also erst einmal würd ich double nehmen, statt float.
Braucht zwar mehr Speicher, speichert die Zahlen aber genauer.

Weist du, wie man Dateien öffnet/schließt?
Ich geh davon aus, sonst sags halt.

Wenn nur eine Zahl pro Zeile ist, könnte man zB so einlesen:

fscanf(datei,"%lf",&arr[element]);

datei ist hier die FILE*
arr ein double-Array und element eben, in das wievielte Arrayelement die Zahl kommen soll.
Einfach mitzählen (nach jedem Einlesen eins erhöhen)

Wenn du element am Anfang auf 0 setzt, könntest du auch gleich ein ++ hinter element schreiben, dann wird es nach jeder eingelesenen Zahl schon automatisch erhöht, ohne einer zusätzlichen Codezeile

Wenn du doch float statt double nimmst, gehört statt dem %lf nur ein %f

Gruß


----------



## maria1 (8. August 2010)

hey, echt lieb dass du so schnell geantwortet hast.
geht das mit fscanf? ich hatte auch diese überlegung, aber ich meine wir haben ja eine txt datei...das würde doch heißen, dass alles was ich da abspeichere wären doch zeichen oder?ich dachte wenn ich dann z.b. "1.27"(in txt ..typ char) in double abspeichere wird in der ascii tabelle für die zeichen '1''2''7' der jeweilige dezimal wert als double in meine double array gespeichert oder lieg ich da voll falsch********ich habe jetzt eine neue überlegung....ich speichere erstmal bis zum zeilenende ('13') alles in ein char array und es gibt doch diese funktion atof() .von stdlib..die meinen string in double umwandelt..das heißt "1.27" wird zu 1.27 umgewandelt und den speichere ich jeweils in einem array feld ab...ich probier das morgen mal aus.


und noch ne kleine frage....ich speichere die ganze zahlen im editor ab...wie schaffe ich denn eine verbindung zwischen editor und meinem c programm****?ich hab das mal gemacht mit DIR ..kommandozeilen usw...aber ich weiß leider nicht mehr genau wie das gehtich hab noch ein programm von  damals , aber ich weiß jetzt gar nicht mehr wie ich das benutze....ich weiß nur noch dass ich bei editor was geschrieben und abgespeichert habe und weiter.................ich hab es vergessen


----------



## sheel (8. August 2010)

maria1 hat gesagt.:


> hey, echt lieb dass du so schnell geantwortet hast.
> geht das mit fscanf? ich hatte auch diese überlegung, aber ich meine wir haben ja eine txt datei...das würde doch heißen, dass alles was ich da abspeichere wären doch zeichen oder?ich dachte wenn ich dann z.b. "1.27"(in txt ..typ char) in double abspeichere wird in der ascii tabelle für die zeichen '1''2''7' der jeweilige dezimal wert als double in meine double array gespeichert oder lieg ich da voll falsch********ich habe jetzt eine neue überlegung....ich speichere erstmal bis zum zeilenende ('13') alles in ein char array und es gibt doch diese funktion atof() .von stdlib..die meinen string in double umwandelt..das heißt "1.27" wird zu 1.27 umgewandelt und den speichere ich jeweils in einem array feld ab...ich probier das morgen mal aus.



Bei scanf bzw. fscanf kann man mit den %...-Angaben bestimmen, wie etwas eingelesen werden soll.
Für die Sache mit ASCII-Werten ist %c hilfreich, mit %lf erkennt die Funktion aber auch problemlos doubles, obwohl sie als einzelne Buchstaben vorliegen.

Das mit dem Zeile einlesen und atof geht natürlich auch.
Du musst aber nicht jedes Byte einzeln ins Array lesen (falls du das vorgehabt hast), da könnte man zB. fgets nehmen. Das liest immer genau eine Zeile ein und speichert die ohne weitere Aktionen in ein Array.




maria1 hat gesagt.:


> und noch ne kleine frage....ich speichere die ganze zahlen im editor ab...wie schaffe ich denn eine verbindung zwischen editor und meinem c programm****?ich hab das mal gemacht mit DIR ..kommandozeilen usw...aber ich weiß leider nicht mehr genau wie das gehtich hab noch ein programm von  damals , aber ich weiß jetzt gar nicht mehr wie ich das benutze....ich weiß nur noch dass ich bei editor was geschrieben und abgespeichert habe und weiter.................ich hab es vergessen


 
 Ich hab leider keine Ahnung, was du vorhast. Erklär das bitte genauer.


----------



## maria1 (8. August 2010)

also die zahlen die ich eintippe und einlesen möchte muss ich doch als datei abspeichern...z.b unter zahlen.txt....das mach ich z.B.im programm "editor".jetzt schreibe ich mein programm in c ...usw. fopen("zahlen.txt","r")....woher weiß mein geschrieber code denn jetzt, in welchem proramm die datei gespeichert ist...damit meine ich word,editor usw. das muss ich doch meinem programm irgenwie mitteilen oder, also dass er meine datei "zahlen.txt" bei editor suchen soll und nicht bei word!verstehst du mein problem?

und damals hatte ich mal eine hausübung gemacht ...ich habe ein programm geschrieben zum zugriff auf die gespeicherte datei!und da musste man irgenwie nicht nuuuuuuur das c programm starten sonder musste im Hintergrund noch auf start->ausführen->cmd...cd... und weiter weis ich nicht mehr...aber ich weiß dass es dazu da war um meinem c programmmitzuteilen wo er nach der abgespeicherten datei suchen muss .
und das c programm fing so an..................int main(int argc, char *argv[])	.......................das ist schon soooooooooo lange her  ichhabe alles vergessen


----------



## sheel (8. August 2010)

maria1 hat gesagt.:


> und damals hatte ich mal eine hausübung gemacht ...ich habe ein programm geschrieben zum zugriff auf die gespeicherte datei!und da musste man irgenwie nicht nuuuuuuur das c programm starten sonder musste im Hintergrund noch auf start->ausführen->cmd...cd... und weiter weis ich nicht mehr...aber ich weiß dass es dazu da war um meinem c programmmitzuteilen wo er nach der abgespeicherten datei suchen muss .
> und das c programm fing so an..................int main(int argc, char *argv[])	.......................das ist schon soooooooooo lange her  ichhabe alles vergessen



Alles klar.
Also: Wenn du ein Programm aus der Konsole (cmd) startest; brauchst du als erstes den besagten Befehl "cd", um der Konsole "mitzuteilen", in welchem Ordner du das Programm gespeichert hast.

Welcher Ordner aktuell gerade eingestellt ist, sieht man sowieso in der Konsole.
zB bist du am Anfang in C:\Programme
Dein Programm ist aber in C:\Programme\MeinProg
dann schreibst du: "cd Mein Prog" (ohne Anführungszeichen), um in den Ordner zu wechseln.

Bei Bedarf kann man mit "cd .." wieder Ordner "aufwärts" gehen, also von
C:\Programme\MeinProg wieder zu C:\Programme
Mit einem zweiten Mal zu C:\
"cd Anderes" würde jetzt zu C:\Anderes gehen...usw

Wenn du dann im passenden Ordner bist, kannst du mit dem Programmnamen das Programm einfach starten. Also wenn die Programmdatei "Prog1" heißt, gibt man "Prog1" oder "Prog1.exe" ein.
Das wäre das gleiche wie ein Doppelklick drauf (außerhalb der Konsole).

In der Konsole kannst du aber zusätzlich noch Parameter mitgeben. Wenn man zB
Prog1 hallo 608
eingibt, kann man dem Programm gleich beim Start auf die Weise eingaben mitgeben, ohne das die erst über scanf etc abgefragt werden müssen.

Dafür ist dann das argc und argv beim main:
Im int argc steht die Anzahl der Parameter (hallo und 608)
In dem Fall wären es zwei, der Programmname Prog1 zählt aber auch noch dazu, also drei.

In argv sind dann die Parameter als Strings/char-Arrays
argv[0] hat "Prog1"
argv[1] hat "hallo"
und argv[2] hat "608" (Achtung: Als char-Array, für die Zahl müsste man atoi/atof verwenden
                                    Kennst du eh schon)


...Rest folgt gleich


----------



## sheel (9. August 2010)

maria1 hat gesagt.:


> also die zahlen die ich eintippe und einlesen möchte muss ich doch als datei abspeichern...z.b unter zahlen.txt....das mach ich z.B.im programm "editor".jetzt schreibe ich mein programm in c ...usw. fopen("zahlen.txt","r")....woher weiß mein geschrieber code denn jetzt, in welchem proramm die datei gespeichert ist...damit meine ich word,editor usw. das muss ich doch meinem programm irgenwie mitteilen oder, also dass er meine datei "zahlen.txt" bei editor suchen soll und nicht bei word!verstehst du mein problem?



Editor+C-Programm gibt kein Problem, weil:

Der Editor ist eines der wenigen Programme, die Dateien auch wirklich so anzeigen und abspeichern, wie sie auf der Festplatte sind und wie sie auch von fopen, fscanf (und was noch so dazugehört) hergenommen werden.

Word hält sich leider nicht daran.
Man merkt davon zwar nichts, wenn man im Word was schreibt, aber es ist gründlich anders als das, was beim Speichern wirklich auf die Platte kommt.

Hier ein Byte, ob die Schrift kursiv ist, da ein int mit der Schriftgröße, den Schriftnamen, dann vielleicht wieder ein paar Wörter vom wirklichen Text...
Alles in allem ein heilloses Kauderwelsch (zumindest wenn es ein Mensch lesen probiert)
Öffne eine doc-Datei im Editor, dann weist du, was ich meine.

Word kann seine eigenen Dateien natürlich verstehen, wenn man sie wieder öffnet.
Das Programm weiß, welcher Byte jetzt welchen Sinn hat.

Ist bei deinem Programm aber leider nicht der Fall.
Würdest du eine doc-Datei öffnen und einlesen, könntest du bei jedem Byte raten, ob er zum "richtigen" Text gehört oder irgendwas anderes ist.

Wenn man wüsste, das (nur ein Beispiel) immer
1)erstes ein Byte mit 1 oder 0 kommt, ob der Text unterstrichen ist
2)Dann ein int mit der Anzahl der Buchstaben
3)Und dann die Buchstaben selber
würde es ja noch gehen, so zu Programmieren, dass das eigene Programm sowas erkennt und sich nur den richtigen Text holt.

Bei den ganzen unzählbaren Möglichkeiten, die Word zur Textgestaltung anbietet, und einer nicht wirklich vorhandenen Erklärung von Microsoft dazu ist das aber ziemlich aussichtslos (oder Monate/Jahre-lange Arbeit)

Um deine Frage also zu beantworten: Du brauchst nirgends einstellen, von welchem Programm die Datei stammt.
Die verwendeten Funktionen holen sich die Daten, wie sie auf der Platte liegen.
Der Editor speichert auch so ab, Word nicht.

Bleib beim Editor.


----------



## maria1 (9. August 2010)

vielen dank für deine mühe und du erklärst echt gutich würde nur noch gerne wissen, ob ich    !int! main(argv,...){}  weglassen kann  ********also ich würde.... !void! main (void){mein ganzes programm hier rein schreiben...fopen etc }...in editor gehen und meine ganzen werte reinschreiben und unter zahlen.txt abspeichern....und in meinem programm gebe ich ein: "..fopen("zahlen.txt","r")" etc...greift mein programm dann automatisch oder muss ich das programm aus der konsole starten****?(das programm soll sich die zahlen holen und dann nach wunsch... durch veschiedene sortierverfahren sortiert werden)


----------



## sheel (9. August 2010)

Natürlich kannst du es einfach so machen.
Einfach das Ganze mit dem argc, argv und dem Konsolen aufmachen weglassen.
Und das Programm mit einem Doppelklick starten.

Nur: WENN du in der Konsole Werte mitgeben möchtest, muss die argc/argv-Geschichte mitprogrammiert sein. Sonst werden die Werte einfach ignoriert.

Gruß

PS: Achte vielleicht etwas mehr auf deine Rechtschreibung, bevor sich ein Mod aufregt
http://www.tutorials.de/content/166-netiquette.html Punkt 15


----------



## maria1 (9. August 2010)

hey also vielen vielen dank für deine hilfe...ich glaube jetzt sehe ich wieder etwas hoffnung für mein programm...also ich werde die nächsten tage das programm fertig machen und wäre super wenn du mir...falls noch fragen entstehen sollten... helfen könntest

viele grüße

PS: wenn du wüsstest wie mein kopf schon raucht(sitze hier an dem problem seit heute morgen), dann würdest du verstehen wiso ich jetzt keine nerven für rechtschreibung habeaber wir konnten uns ja verständigen und du hast mir geholfen


----------



## maria1 (9. August 2010)

hallo,
also ich habe mein programm jetzt begonnen....... und bin leider auf das problem gestoßen...was ich befürchtet hatteich habe eine funktion ...die überprüft,ob meine datei(die ich im hauptprogramm eingebe) existiert oder nicht. ich schreibe zahlen im programm" editor" und speichere sie irgendwo ab z.b. unter "zahlen.txt". und schließe editor...und dann compiliere ich mein programm und gebe  im hauptprogramm als dateiname "zahlen.txt" an. und dann schreibt er auf dem bildschirm"datei existiert nicht", obwohl dir datei doch vorhanden ist...ich denke dass mein quellcode richtig geschrieben ist....der springt ja in die funktion rein...aber er findet die datei nicht.....was mache ich denn falsch?vielleicht bei der abspeicherung von der datei im editor?muss die datei unter einem bestimmten ordner abgespeichert sein? .....

wäre echt super,wenn mir da jemand helfen würde....


----------



## sheel (9. August 2010)

Wenn du keinen fad dazuschreibst, muss die Datei im gleichen Ordner sein wie das Programm.

Sonst: Welchen Compiler/DE benutzt du?
Wie startest du das Progamm (Konsole, Doppelklick, aus der Entwicklungsumgebung)?

Noch eine häufige Fehlerursache: Windows kürzt das ".txt" der Dateinamen (im Explorer) gern weg und zeigt dafür halt ein Symbol, an dem man den Dateityp erkennt.
Wenn wirklich "zahlen.txt" angezeigt wird, wenn das ganze einmal einfach in "zahlen" um.
Wenn das Textdateiensymbol bleibt, wars das.


----------



## maria1 (9. August 2010)

danke für deine antwort
ja du hattest recht ich musste zahlen.txt datei im selben ordner haben wie das programm...jetzt geht es auchich habe aber mein programm noch etwas veändert ,so dass ich über die konsole gleich den dateinamen"zahlen.txt" als parameter an mein int main(argv etc) übergebe.
welchen pfad muss ich denn eingeben , dass mein programm über die konsole gestartet wird und ich gleich den dateinamen als parameter mit übergeben kann?
also zahlen.txt steht jetzt im ordner des programmes visual studio...also c\benutzer\documents\visual studio usw.!mein geschriebenes programm steht unter c\test\studienarbeit ....was müsste ich in der konsole alles eigeben ,damit er macht was er soll****?

ganz liebe grüße


----------



## sheel (9. August 2010)

```
cd c:\test\studienarbeit
programm "c\benutzer\documents\visual studio\zahlen.txt"
```

Die Anführungszeichen braucht man, wenn Leerzeichen im Pfad sind, damit alles zusammen genommen wird.
Sonst wäre bis zum visual ein argv-teil, ab studio der nächste


----------



## maria1 (11. August 2010)

hey dankeschön
also bin jetzt fertig mit meinem programm ...und es läuft so wie ich es haben wollte.will es jetzt nur noch verfeinern...und habe dazu noch eine frage.wenn meine sortierten zahlen(double) ausgegeben werden,steht z.b. 1.200000000000000000...wie bekomme ich denn die nullen weg?gibt es da irgendeine einstellung?


----------



## engelmarkus (11. August 2010)

Gib die Zahlen so aus:

```
printf("%.2f\n", zahl);
```
Damit schreibt er nur 2 Nachkommastellen auf.
Hier noch eine schöne Übersicht, was man mit printf alles machen kann: Link


----------



## maria1 (11. August 2010)

aber dann macht er doch alle zahlen auf zwei nachkommastellen...stell dir vor da steht 1.35460000....153.2000..dann würde doch stehen 1.35 und 153.20...das will ich ja nicht....das printf soll nur die überflüssigen nullen erkennen und wegschneiden...geht das nicht****?


----------



## engelmarkus (12. August 2010)

Hm... und wie siehts mit "%g" aus? Das sollte schon besser sein. Besser gehts glaub ich mit printf nicht. Dann müsstest du mit sprintf das in einen String schreiben lassen, und den dann selbst modifizieren, bevor du ihn ausgeben lässt.


----------

