Zahlen aus Datei lesen und Verarbeiten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zahlen aus Datei lesen und Verarbeiten

    Hallo,

    ich habe folgendes kleines Problem. Ich habe eine Datei mit einer Zahl pro Zeile.
    Die ersten beiden Zahlen ergeben Spalten und Zeilen einer Matrix. Wenn also 3 und 4 die ersten Zahlen sind währe es eine 3x4 Matrix.
    Alle Zahlen danach sind Double werte und Inhalt der Matrix. Ich möchte nun diese Datei einlesen, und anschließend Spalte und Zeile angeben.
    Die Zahl möchte ich sehen und entscheiden ob ich sie ändern will.
    So ich kann schon einlesen und hab schon das eingelesene in Double konvertiert. Mir fällt aber grad nicht ein wie ich die ersten beiden Zahlen überspringen
    könnte. Außerdem wüsst ich grad nicht wie ich das ganze dann zurückspeichere.
    Ich würde das auch gern als Array oder direkt im File aber nicht als Matrix machen.
    Hier erstmal mein bissheriges

    Quellcode

    1. #include <stdio.h>
    2. #include <iostream>
    3. #include <string.h>
    4. #include <stdlib.h>
    5. int main(int argc, char *argv[]) {
    6. char eingabe[20];
    7. char name;
    8. char puffer[500];
    9. FILE *fp;
    10. if (argv[1] == NULL) {
    11. printf("Gib einen Dateinamen an \n");
    12. scanf("%s", eingabe);
    13. }
    14. else {
    15. strcpy(eingabe, argv[1]);
    16. }
    17. if ((fp = fopen (eingabe,"r")) == NULL){
    18. printf("Fehler beim Öffnen der Datei\n");
    19. exit(1);
    20. }
    21. while(fgets(puffer, sizeof(puffer), fp) != NULL){
    22. double matrix = atof(puffer);
    23. printf("Pufferinhalt: %f", matrix);
    24. printf("Pufferinhalt: %s", puffer);
    25. }
    26. fclose (fp);
    27. system("pause");
    28. return 0;
    29. }
    Alles anzeigen

    Jemand Ideen?

    Grüße Roman

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von ul7ima ()

  • Vielleicht das Problem nicht genau genug beschrieben?

    Also nochmal zu meinem Problem,

    ich weiß jetzt nicht wie ich auf die eingelesenen Zahlen zugreifen kann.
    Muss ich die erst mit einer Schleife in ein Array schreiben? Wie genau? Mit Zeiger?
    Ich hab da auch irgendwie kein passendes Beispiel gefunden wo ich das Prinzip verstehen könnte.

    Währ cool wenn sich jemand erbarmen könnte ;>

    Grüße
  • Es reicht wenn du die ersten Zeilen einfach ausliest und damit erfährst wie groß die Matrix sein soll. Danach kannst du ein zweidimensionales Array alloziieren und die Werte da rein speichern. Das ist schon der ganze Trick dabei :)

    Wie die Datei zeilenweise ausgelesen werden kann steht bei dir bereits im Quelltext:

    Quellcode

    1. fgets(puffer, sizeof(puffer), fp)


    Nur eben ohne die Schleife ... warum auch, wenn du nur jeweils einen Wert willst?

    Zum weiterlesen:
    * cplusplus.com/reference/clibrary/cstdio/fgets/
    * cplusplus.com/reference/clibrary/cstdlib/malloc/
    * google.de/search?q=2d%20array%20malloc

    Achja: wenn du erwartest dass dir jemand einen kompletten Quelltext hinstellt ... evtl. macht das jemand sogar, aber davon hätte keiner was. Hausaufgaben macht man am besten selbst ;)
  • Hallo,

    ok vielen Dank erstmal. Habe jetzt die Spalten und Zeilen eingelesen.
    Aber das war ne alte Klausur aufgabe und ich möchte die als Vorbereitung machen.
    Und da sollte man das ohne Matrix machen.

    Wie kann ich an eine bestimmte Stelle von der Datei etwas einfügen? Also z.B. die 6.Spalte ersetzten?
    Sicher mit puts oder so ... aber wie halt an der bestimmten Stelle?
  • In eine existierende Datei etwas einfügen?

    Du erstellst, eventuell nur temporär, eine weitere Datei und kopierst die Daten der existierenden Datei z.B. bis Zeile 6 - fügst dann deine neuen Daten ein - und dann kopierste ab Zeile 7 weiter, in die weitere Datei. Wie du anschliessend welche Datei umbenennst und/oder löscht bekommst du sicher selbst heraus. Es gibt da nicht nur eine Variante.

    Viel Spass bei üben
    bcc-fan
  • Was ist hier Falsch?

    Hallo ich verstehe das nicht ganz. Habe das jetzt so weit zusammengebastelt.
    An der Stelle wo ich Abfrage ob man die Zahl ändern will macht der nur noch kacke.
    Der liest das j oder n nicht ein. Da ließt er irgendwas. Hab auch schon anderes Probiert.
    Auch liest er danach den Double wert Falsch...warum?

    C-Quellcode

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>
    4. int main(char argc, char *argv[]) {
    5. char eingabe[20];
    6. int zeingabe;
    7. char name;
    8. char puffer[500];
    9. double neuezahl;
    10. int spalten, spaltenb;
    11. int zeilen, zeilenb;
    12. int zaehler = 1;
    13. int weiter = 0, ende = 0;
    14. int zahl;
    15. int i=1;
    16. int k, elementenzahl, position;
    17. FILE *fp;
    18. if (argv[1] == NULL) {
    19. printf("Gib einen Dateinamen an \n");
    20. scanf("%s", eingabe);
    21. }
    22. else {
    23. strcpy(eingabe, argv[1]);
    24. }
    25. while (ende != 1){
    26. if ((fp = fopen (eingabe,"r+")) == NULL){
    27. printf("Fehler beim Öffnen der Datei\n");
    28. exit(1);
    29. }
    30. fgets(puffer, sizeof(puffer), fp);
    31. printf("Anzahl der Zeilen ist: %s",puffer);
    32. zeilen = atoi(puffer);
    33. fgets(puffer, sizeof(puffer), fp);
    34. printf("Anzahl der Spalten ist: %s",puffer);
    35. spalten = atoi(puffer);
    36. k = spalten*zeilen+2;
    37. elementenzahl = k;
    38. char speicher[k];
    39. speicher[1]=zeilen;
    40. speicher[2]=spalten;
    41. elementenzahl -= 2;
    42. position = 3;
    43. while (weiter != 1){
    44. printf("Geben Sie bitte die Zeile an:\n");
    45. scanf("%i", &zeingabe);
    46. if(zeingabe <1 || zeingabe > zeilen){
    47. printf("Geben Sie bitte Zahl im gültigen Bereich an!\n");
    48. }
    49. else{
    50. zeilenb = zeingabe;
    51. weiter = 1;
    52. }
    53. }
    54. weiter = 0;
    55. while (weiter != 1){
    56. printf("Geben Sie bitte die Spanlte an:\n");
    57. scanf("%d", &zeingabe);
    58. if(zeingabe <1 || zeingabe > spalten){
    59. printf("Geben Sie bitte Zahl im gültigen Bereich an!\n");
    60. }
    61. else{
    62. spaltenb = zeingabe;
    63. weiter = 1;
    64. }
    65. }
    66. weiter = 0;
    67. zahl = (zeilenb-1)*spalten+(spaltenb-1)+2;
    68. while(i != zahl-1){
    69. fgets(puffer, sizeof(puffer), fp);
    70. double inhalt = atof(puffer);
    71. speicher[position] = inhalt;
    72. i++;
    73. elementenzahl--;
    74. position++;
    75. }
    76. fgets(puffer, sizeof(puffer), fp);
    77. double inhalt = atof(puffer);
    78. char c;
    79. printf("Ausgewaehltes Element: %f \n", inhalt);
    80. printf("Soll die Zahl geaendert werden? j/n \n");
    81. printf("%c",c);
    82. c = 'j';
    83. printf("%c",c);
    84. scanf("%c", &c);
    85. if (c == 'n'){
    86. fclose(fp);
    87. ende = 1;
    88. }
    89. else{
    90. printf("Hoe hab doch gar nix gemacht\n");
    91. printf("Geben sie eine neue Zahl ein:\n");
    92. scanf("%f", &neuezahl);
    93. printf("Die neue Zahl ist: %f\n",neuezahl);
    94. speicher[position] = neuezahl;
    95. elementenzahl--;
    96. position++;
    97. }
    98. while(elementenzahl > 0){
    99. fgets(puffer, sizeof(puffer), fp);
    100. double inhalt = atof(puffer);
    101. speicher[position] = inhalt;
    102. printf("Bis zu ende Kopieren: %s",speicher[position]);
    103. position++;
    104. elementenzahl--;
    105. }
    106. if ((fp = fopen (eingabe,"w")) == NULL){
    107. printf("Fehler beim Speichern der Daten\n");
    108. exit(1);
    109. }
    110. elementenzahl = 1;
    111. while (position > 0){
    112. neuezahl = speicher[elementenzahl];
    113. fprintf(fp ,"%f",neuezahl);
    114. elementenzahl++;
    115. position--;
    116. }
    117. printf("Soll noch eine Zahl geändert werden? j/n\n");
    118. scanf("%c", &c);
    119. if ('n' == c) {
    120. close(fp);
    121. ende = 1;
    122. }
    123. }
    124. return 0;
    125. }
    Alles anzeigen
  • Du solltest nicht soviel Quelltext in main hinein packen sondern das Ganze auf mehrere kleinere in der Regel übersichtliche Funktionen verteilen.
    Mit der Formatierung geht es meiner Ansicht auch noch übersichtlicher ;)

    Ich hab es nur überflogen:
    die Zeilen

    Quellcode

    1. scanf("%c", &c)

    machen oft nicht das was der Autor will - da kann man sich seitenweise im Internet vergnügen - das Dumme ist, das die Lösungen manchmal funktionieren, aber nicht immer zuverlässig sind.

    Vielleicht hat ja folgende Lösung auch noch einen Haken:

    Quellcode

    1. scanf("%1s", &c)

    mir ist aber noch keiner bekannt.

    Hab es nicht getestet, hoffe das ich keinen Zeichendreher eingebaut habe.

    Nachtrag: nimm die C&C++ Tags für den Quelltext 8)

    MfG bcc-fan