C - cmd - txt-Datei als Eingabe in ein Programm umleiten



  • 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<datei.txt

    mache liest er immer nur den erste Wert ein

    die txt-Datei sieht ungefähr so aus

    -18
    93
    27
    -86
    22
    28
    -43
    96
    24
    88
    95
    -10

    er speichert aber nur die -18 im Array ein

    mein Programmcode

    #include <stdio.h>
    
    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 ;
    }
    
    

    *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

    scanf ( "%d" , A + us ) ;
    

    und gebe mir den inhalt dann auch als Zahlen aus mit

    printf ( "[%03u] %3d\t" , s , A [ s ] ) ;
    

    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

    scanf ( "%c" , A + us ) ;
    

    man kann damit keine zweistelligen Zahlen einlesen glaube ich
    Vielen Dank,

    James



  • @JamesNguyen sagte in C - cmd - txt-Datei als Eingabe in ein Programm umleiten:

    auto char A [ 143 ] ;

    Warum benutzt du auto?

    unsigned short us = getArray ( A , ( sizeof ( A ) - 1 ) / sizeof ( * A ) )

    Wo kommt die -1 her?

    fflush ( stdin ) ;

    Frag dich einmal selbst, was diese Zeile tut, wenn du stdin umgeleitet hast. Abgesehen davon, dass dies eigentlich undefiniertes Verhalten ist. Siehe https://en.cppreference.com/w/c/io/fflush



    1. das auto kann man glaube ich auch weglassen, dass ist ja nur glaube ich dafür dass man sagt das landet auf dem stack

    2. ich hatte mir das so gedacht da immer betont wurde der letzte platz in einem char Array muss für die \0 für die Terminierung
      sein

    wir sollten ein Array zum einlesen von bis zu 142 zeichen erstellen mein array hat also deshalb 143 größe

    ich lese aber nur bis sizeof = 142 wert ein

    1. aha ok, ich kenne mich damit nicht so gut aus aber ich glaube es gibt stdin, stderr und stdout
      für die Standardeingabe, Standardfehlerausgabe, Standardausgabe

    Ich kann das natürlich ausprobieren aber kannst du erklären warum hier welches richtig ist?

    das fflush bleibt aber denke ich das brauche ich ja um den eingabepuffer zu lösschen.



  • aber eig verstehe ich es nicht

    das programm schreibe ich ja unabhängig von der umleitung einer datei zur Eingabe

    und für nutzereingaben ist

    fflush stdin
    und dann

    scanf

    eig schon richtig..



  • ok mit stderr und stdout kommt jetzt das richtige raus. bei beiden das gleiche



  • also was macht es für einen unterschied ob die EIngabe von mir auf der Tastatur kommt oder aus einer Datei

    wieso braucht man letzterem jetzt eine Standard Ausgabe?

    tut mir leid habe deinen link übersehen schau mal rein



  • @wob sagte in C - cmd - txt-Datei als Eingabe in ein Programm umleiten:

    fflush ( stdin ) ;

    ok heißt das

    fflush ( stdin ) ;

    ist allgemein falsch und undefiniertes Verhalten?

    Ich glaube in der Vorlesung hat er uns bei Nutzereingaben das genau so beigebracht



  • Aber erstmal danke für die Hilfe ich kann jetztz weiter arbeiten



  • @JamesNguyen sagte in C - cmd - txt-Datei als Eingabe in ein Programm umleiten:

    @wob sagte in C - cmd - txt-Datei als Eingabe in ein Programm umleiten:
    ok heißt das

    fflush ( stdin ) ;

    ist allgemein falsch und undefiniertes Verhalten?

    Richtig, siehe hier: https://en.cppreference.com/w/c/io/fflush

    Ich glaube in der Vorlesung hat er uns bei Nutzereingaben das genau so beigebracht

    Das ist schlecht.

    Siehe hier: https://docs.microsoft.com/en-us/previous-versions/9yky46tz(v=vs.140), Zitat: " // fflush on input stream is an extension to the C standard" - d.h. das geht nur mit Visual Studio. Und in neueren Versionen finde ich diesen Hinweis gerade nicht mehr.

    Zu deiner ersten Frage: war vorhin am Handy und hatte angenommen, dass dein getArray ein Array von ints füllt. Du hast ja ein char-Array. Aber jetzt bin ich völlig verwirrt von deinem Code. Was soll dein getArray überhaupt machen?! Und dann noch die verschachtelten Schleifen darin? Ich bin komplett raus und habe keine Idee, was eigentlich dein Ziel ist.

    scanf("%d", &adr) liest einen int ein, nicht einen char.

    Das "-1 für \0 als letztes Zeichen" gilt (nur) für Strings.



  • @JamesNguyen C kennt keine Tastatur - es sieht nur den Datenstrom der rein kommt.

    Willst du jetzt Zahlen lesen (und damit rechnen) oder Zeichen?

    Wenn du Zahlen möchtest (bietet sich bei der .txt an) sollte man ein int-Array nehmen.
    Bei Zeichen gibt es Besseres (und schnelleres) als scanf("%c",


Log in to reply