Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C - cmd - txt-Datei als Eingabe in ein Programm umleiten
Autor
Universität/Hochschule C - cmd - txt-Datei als Eingabe in ein Programm umleiten
JamesNguyen
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 08.11.2020
Mitteilungen: 189
  Themenstart: 2021-03-02

Hallo, ich habe eine Programm geschrieben array.c bzw. dazu habe ich dann die array.exe Das Programm liest mit scanf wert ein wenn ich in cmd nun ( im Verzeichnis bei der Dateien ) array.exe unsigned short getArray ( char A [ ] , short ) ; int main ( void ) { auto char A [ 143 ] ; unsigned short us = getArray ( A , ( sizeof ( A ) - 1 ) / sizeof ( * A ) ) ; printf ( "\n" ) ; auto unsigned short s ; for ( s = 0 ; s < ( sizeof ( A ) - 1 ) / sizeof ( * A ) ; s ++) printf ( "[%03u] %3d\t" , s , A [ s ] ) ; return 0 ; } unsigned short getArray ( char A [ ] , short anzahl ) { auto unsigned short us , us2 , us3 = 0 ; for ( us = 0 ; us < anzahl ; us ++ ) { fflush ( stdin ) ; scanf ( "%d" , A + us ) ; us3 ++ ; if ( us > 1 && A [ us ] == 0 && A [ us - 1 ] == 0 && A [ us - 2 ] == 0 ) { for ( us2 = us ; us2 > us - 3 ; us2 -- ) A [ us2 ] = 0 ; us3 -= 3 ; break ; } } return us3 ; } \sourceoff *Anm: Da wir ein Textdatei mit Zahlen bekommen haben bin ich mir unsicher was zutun ist gerade lese ich - da ich weiß dass es sich um Zahlen handelt - die EIngaben als Zahlen ein wie man im Code sieht mit \sourceon nameDerSprache \numberson scanf ( "%d" , A + us ) ; \sourceoff und gebe mir den inhalt dann auch als Zahlen aus mit \sourceon nameDerSprache \numberson printf ( "[%03u] %3d\t" , s , A [ s ] ) ; \sourceoff man könnte naürlich auch die Zahlen als Zahlen einlesen und dann mit %c ausgeben falls die Zeichen als Zahlen codiert sind. Da muss ich aber nochmal nachfragen was da genau gewollt wurde Was jedenfalls nicht funktioniert ist \sourceon nameDerSprache \numberson scanf ( "%c" , A + us ) ; \sourceoff man kann damit keine zweistelligen Zahlen einlesen glaube ich Vielen Dank, James


   Profil
JamesNguyen
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 08.11.2020
Mitteilungen: 189
  Beitrag No.1, vom Themenstarter, eingetragen 2021-03-02

ok mit fflush ( stderr / stdout ) funktioniert es ich kenne ich mit stdin stderr stdout nicht so gut aus ich weiß dass sind für die Standardeingabe, Standardfehlerausgabe, Standardausgabe kann jemand erklären warum das jetzt richtig ist?


   Profil
JamesNguyen
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 08.11.2020
Mitteilungen: 189
  Beitrag No.2, vom Themenstarter, eingetragen 2021-03-02

aber ich kann jetzt erstmal weiter am programm arbeiten


   Profil
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
DerEinfaeltige
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.02.2015
Mitteilungen: 2989
  Beitrag No.3, eingetragen 2021-03-02

Hier eine kurze Version, wie ich als C-Fremdling es quick&dirty implementieren würde: \sourceon C \numberson #include #include // Read the File fileName and // apply function f with // arguments data and idx void readData(char *fileName, int (*f)(char*,void*,int*,int), void *data, int *idx, int maxData){ FILE* filePointer; int bufferLength = 255; char buffer[bufferLength]; filePointer = fopen(fileName, "r"); while(fgets(buffer, bufferLength, filePointer)) { if (!f(buffer,data,idx,maxData)) break; } fclose(filePointer); } // Convert line to int, // save result in data // at position idx // and advance idx int readInt(char *line, void *data, int *idx, int maxData){ if (*idx >= maxData) return 0; int *arr = (int*) data; arr[(*idx)++] = atoi(line); return *idx; } int main(){ int array[8]; int idx = 0; readData("Data.txt",readInt, array, &idx, 8); int i; for (i = 0; i < idx; ++i){ printf("%d\n",array[i]); } } \sourceoff


   Profil
__blackjack__
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 23.09.2021
Mitteilungen: 29
  Beitrag No.4, eingetragen 2021-09-25 18:28

@JamesNguyen: Deine Lösung ist keine Lösung weil `fflush()` auf Eingabeströmen mehr oder weniger undefiniertes Verhalten ist. Im Quelltext wie er jetzt in der Frage steht, ist auch gar kein Problem ohne diesen Aufruf. `scanf()` mit "%d" überliest „whitespace“-Zeichen automatisch, inklusive Zeilenendezeichen. Ich sehe noch einen weiteren Fehler: Als Vorbemerkung: Der Typ `char` ist ein bisschen problematisch, weil `char` früher entweder `signed` oder `unsigned` war, je nach dem was der Compiler(autor) da entschieden hat, und heute sogar ein eigener Typ ist. `signed char`, `unsigned char`, und `char` ohne alles, sind im aktuellen Standard drei unterschiedliche Dinge, die bei Zuweisungen entsprechende Warnungen bringen können/sollten. `char` ist für Zeichen gedacht, und `signed char` und `unsigned char` für Zahlen. Wenn es um Zahlen geht, und das scheint es hier ja, würde ich den entsprechenden, eindeutigen Typ-Alias verwenden. In diesem Fall also `int8_t`. Und falsch ist der Formatcode "%d" (`int`); der passt nicht zu `char`. Das kann problematisch werden wenn der erzeugte Code tatsächlich alle Bytes für den `int`-Wert in den Speicher schreibt. Bei „Little Endian“-Architekturen hast Du noch Glück, dass der eigentliche Wert an der richtigen Stelle landet und nicht 1, 3, oder 7 Bytes weiter, je nach dem ob ein `int` 16, 32, oder 64 Bit hat. Aber auch dort wird am Ende des Arrays unter Umständen über das Array hinaus geschrieben und richtet Schaden an. Auch hier verwendet man am besten wieder einen Alias der in inttypes.h definiert ist. Wenn man den Typ auf genau 8-Bit pro Element fesgesetzt hat, ist ``(sizeof(A) - 1) / sizeof(*A))`` IMHO nicht mehr wirklich nötig, da kann man dann ja davon ausgehen, dass ``sizeof(A) - 1`` ausreicht. Ansonsten würde ich das in einem Makro verschwinden lassen, weil es zweimal im Quelltext steht. Warum eigentlich die -1? Damit wird das letzte Byte im Array garantiert nicht gefüllt, es wird aber auch nirgends garantiert, welchen Wert das hat. `A` enthält am Anfang undefinierte Werte. Und die Fragerei geht weiter: Warum `short`/`unsigned short`? Das ist eine komische Wahl, weil man ja nicht wirklich weiss wie gross der Wertebereich tatsächlich ist, ausser kleiner oder gleich dem von `int`. Ich würde da nicht von `int` abweichen solange ich nicht weiss welche Grösse benötigt wird, und dann würde ich die Aliase für die garantierten Grössen verwenden, denn sonst ist das ja nicht wirklich portabel. Beim einlesen macht die innere ``for``-Schleife keinen Sinn. Das ``if`` stellt fest, dass die letzten drei Werte 0 sind, und die Schleife setzt dann die letzten drei Werte auf 0. `us3` ist redundant, weil das immer den gleichen Wert wie `us` hat. Die Namensgebung ist übrigens nicht gut. Einfach immer den Datentyp abzukürzen und eine laufende Nummer dran zu hängen hilft dem Leser so gar nicht weiter. ``auto`` ist überflüssig, das habe ich so noch nie tatsächlich in Quelltext gesehen der nicht *sehr*, na sagen wir mal ”historisch” war. 🤓 \sourceon C \numberson #include #include unsigned int getArray(int8_t A[], unsigned int anzahl) { unsigned int i; for (i = 0; i < anzahl; i++) { scanf("%" SCNd8, A + i); if (i >= 2 && A[i] == 0 && A[i - 1] == 0 && A[i - 2] == 0) { i -= 3; break; } } return i; } int main(void) { /* * TODO Mindestens das allerletzte Element, das hier nie beschrieben wird, * sollte man vielleicht initialisieren. */ int8_t A[143]; unsigned int anzahl_gelesen = getArray(A, sizeof(A) - 1); printf("\n"); unsigned int i; for (i = 0; i < sizeof(A) - 1; i++) { printf("[%03u] %3d\t", i, A[i]); } return 0; } \sourceoff


   Profil

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]