Datei und Arrays
-
Vielen Dank für Antwort.
Ich wollte nur ein Array anlegen, welches 10 Interwerte aufnimmt.
Danach sollten diese Werte angezeigt werden.fgets(array_a,10,fp);
Der erste Parameter soll doch auf das Array zeigen, in welchem die Werte gespeichert sind. Der zweite Parameter gibt die Anzahl der Zeichen an.
Der Dritte ist ein Zeiger auf die File-Struktur.Wo liegt denn mein Fehler??
fgets ließt doch direkt alles ein, oder?Danke
-
LCC heißt der tolle Compiler
-
Wo liegt denn mein Fehler??
Das kann ich dir erst sagen, wenn du mir sagt, was in der Datei steht.
-
Habe gerade rausgefunden das man keine Schleife braucht
#include <stdio.h> #include <stdlib.h> #define WERT 100 int main(void) { char array_a[30]; FILE *fp; int count = 0; for(count=0;count<30;count++) { array_a[count]=0; } if((fp=fopen("kurs2005.txt","rt"))==NULL) { fprintf(stderr,"Fehler1","kurs2005.txt"); } fgets(array_a,50,fp); fclose; for(count=0;count<30;count++) { printf("%c",array_a[count]); } return 0; }
**
DATEI: Kurs2005
1122334455
2222222222
3333333333**Leider wird nur ,,3333333333" angezeigt.
Die Funktion ,,fgets" springt doch automatisch in die nächste Zeile?
-
Da hast du also 10 Bytes pro Zeile, die eine Zahl darstellen.
Momentan hast du die als Zeichenkette, wenn du einen Zahlen-Typ willst,
mußt du das noch umwandeln: man: strtol, dann könnte man auch damit rechnen.Die Funktion ,,fgets" springt doch automatisch in die nächste Zeile?
Jein. fgets liest maximal "50" Zeichen, weniger jedoch falls vorher der Zeilenumbruch kommt. (rtm)
for(count=0;count<30;count++) { printf("%c",array_a[count]); }
Oder auch einfach
printf(array_a); /* oder */ printf("%s", array_a);
Siehe man: printf.
for(count=0;count<30;count++) { array_a[count]=0; }
Oder auch einfach
memset(array_a, 0, 30);
Siehe man: memset.
fprintf(stderr,"Fehler1","kurs2005.txt");
Da ist noch immer ein Parameter zu viel. Es müsste ein %s im 2. Parameter sein,
damit das stimmt.fclose;
Mein gcc schrieb:
warning: statement with no effect
Da hat er reicht. Du meintest
fclose(fp);
Und falls deine IDE den Code nicht formatieren kann, schau dir auch man: indent an.
Ich möchte wetten, dass die meisten hier so schlecht formatierten Code gleich gar nicht lesen werden.
-
Ich lade mir am WE einen neuen Compiler.
Leider bekomme ich aber nur die erste Zeile angezeigt.
Reicht das:for(count=0;count<30;count++) { printf("%c",array_a[count]); }
-
Den Code habe ich jetzt mit deinen Vorschlafen verbessert.
Allerdings bekomme ich immer nur die erste Zeile angezeit.
Brauche ich noch eine Schleife für gets??
Der müsste das ja auch ohne Schleife den Umbruch der Zeile erkennen.#include <stdio.h> #include <stdlib.h> int main(void) { int array_a[30]; FILE *fp; int count = 0; memset(array_a, 0, 30); if((fp=fopen("kurs2005.txt","rt"))==NULL) { fprintf(stderr,"Fehler1","kurs2005.txt"); } fgets(array_a,30,fp); fclose; printf(array_a); return 0; }
-
Keine Lösung??
-
fgets() liest nur eine Zeile. (wie oft noch?)
fread() liest im Gegensatz auch über Zeilenumbrüche.Bevor ich dir jetzt ein neues Manual schreibe, so liest du die Datei
in einen Puffer:#include <stdio.h> #include <stdlib.h> int main(void) { char array_a[40]; // 30 war zu klein, weil du 30 Ziffern + mind 2 Zeilentrenner hast = mind. 32 FILE *fp; if((fp = fopen("kurs2005.txt","rt")) == NULL) { fprintf(stderr, "Fehler1: %s", "kurs2005.txt"); return 1; // wenn Datei nicht da, wird das Lesen nicht hinhauen } array_a[fread(array_a, 1, 39, fp)] = '\0'; // fread terminiert nicht -- selbst machen fclose(fp); printf(array_a); return 0; }
Wenn du aber Zahlen statt einer Zeichenkette willst, solltest du aber zeilenweise
einlesen und dann umwandeln.EDIT:
Frage mich gerade, ob du den Unterschied zwischen Zahlen-Typen und durch Zeichenketten
dargestellte Zahlen überhaupt siehst. Siehst du ihn?
-
Ich konnte dieses Problem auf eine andere Weise lösen:
Die Datei einfach zeichenweise auslesen, '0' subtrahieren, aber beim jeden speichern in das Array darauf achten, das es auch wirklich Zahlen sind.
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int array_a[30]; memset(array_a, 0, 30); if((fp=fopen("kurs2005.txt","r"))==NULL) { fprintf(stderr,"Fehler1: \n","kurs2005.txt"); exit(1); } int j = 0; int tmp; for(; j < 30; ) { tmp = fgetc(fp); if(tmp > 47 && tmp < 58) { array_a[j] = tmp - '0'; j++; } } fclose(fp); int i = 0; for(;i < 30;i++) { printf("%d",array_a[i]); } return 0; }
-
Im Prinzip das gleiche wie der Vorposter aber variabler ...
#define FILENAME "kurs2005.txt" #define MAXSIZE 128 (...) // fill and print array memset(numbuffer, 0, MAXSIZE * sizeof(int)); for(i = 0; i < MAXSIZE && (c = fgetc(fp)) != EOF; ) { if(isdigit(c)) { numbuffer[i] = c - '0'; printf("%3d%s", numbuffer[i], (i + 1) % 10 == 0 ? "\n" : ""); i++; } } printf("\nEs wurden %d Zahlen eingelesen.\n", i); (...)
Aufpassen bei memset. Das hier greift zu kurz:
int array_a[30]; memset(array_a, 0, 30); // ints sind größer als 1 byte // also: memset(array_a, 0, 30 * sizeof(int))