öffnen und ausgeben einer Datei.



  • Moin!!!
    Ich habe ein Buch und versuche grade das da abgebildete Programm zu verstehen. Funktionieren tut es.
    Probleme habe ich mit den folgenden zeilen

    ch=fgetc(stream);
    while(!=feof(stream))
    {
    putchar(ch);
    ch=fgetc(stream);
    }
    

    zu den Variablen: stream ist ein Pointer der auf eine Datei zeigt, ch ist eine int-variable.

    jetzt meine Fragen: man will ch doch den wert eines Zeichens zuweisen. Ich dachte das man auf den inhalt einer Adresse mit *stream zugreift und stream würde die Adresse zurückgeben. 😕
    dann noch die anweisung while(!=feof(stream)) also so lange stream nicht zuende ist...Woher weiß der zeiger das er nach und nach weiterlaufen soll. macht das diese funktion "feof"? ich hätte erwartet das da sowas wie "stream++;" oder so stehen müsste, damit der zeiger weiter läuft.
    Oder hab ich irgendwas ganz falsch verstanden? Hab auch grade erst mit zeigern angefangen...



  • Funktionieren tut es.

    😕

    stream ist *FILE, und zwar immer auf das gleiche Ziel; wenn das Programm liefe. Tut es aber nicht, weil !=feof(stream) ein Fehler ist. Also das = weg.

    Den Zeiger bekommst du wenn *stream->_cnt > 0 dann als *stream->_ptr, anderfalls bekommst ihn durch Pufferfüllung _filbuf[stream]. Dafür gibt es getc() usw, denen man da nicht hineinpfuschen sollte.



  • Ok. Das war Blödsinn. Der Stern bei stream._cnt war natürlich unnötig. Also ist dein Programm auch so formulierbar:

    #include <stdio.h>
    
    int main (int ac, char **av) {
        while (putchar(stdin->_cnt-- ?
                       (int)(unsigned char) *stdin->_ptr++ :
                       _filbuf(stdin)) != EOF)
            ;
        return 0;
    }
    


  • Hallo,
    ich versuche momentan auch den Inhalt einer Datei auszugeben mit folgendem Quellcode:

    #include <fstream>
    #include <iostream>
    
    int main()
    {
        ifstream file;
    	char output[100];
    	int x;
    
    	file.open("test.txt");	//open a file
    
    	file>>output;		//write to it
    	std::cout<<output;		//result = Hello file
    	file>>x;			
    	std::cout<<x;			//result = 75
    
    	file.close();			//close it
    	return 1;
    }
    

    nur habe ich jetzt immmer das Problem, das Dev C++ (trotz include von fstream) die Funktion ifstream nicht kennt. Es wird kein Fehler ausgegeben, dass es den include fstream nicht gibt. Was ist jetzt falsch?



  • std::...



  • Was ist an std:: falsch? Wenn ichs nicht setzte, kennt der Compiler dann cout ja nicht. Ausserdem geht es ja um ifstream...



  • Stier X schrieb:

    Was ist an std:: falsch? Wenn ichs nicht setzte, kennt der Compiler dann cout ja nicht. Ausserdem geht es ja um ifstream...

    -.-

    Er wollte damit nur sagen, dass du ein "std::" vor ifstream setzen sollst..

    // und außerdem kannst du keine Datei mit ifstream beschreiben. Richtiger Code folgt noch..

    //

    #include <fstream> 
    #include <iostream> 
    
    int main() 
    { 
        std::ifstream out; 
    	std::ofstream in;
        char output[100];
    	std::cin >> output;
    	in.open("test.txt"); // öffnen zur Eingabe
        in << output; 
    	out.open("test.txt");  // öffnen zur Ausgabe
    	std::cout<<out;   
    
    	// ..
        return 0; 
    }
    

    Als Alternative kannst du auch fstream verwenden(mit std::ios::in | std::ios::out)



  • Also ich habe vor wenigen Minuten folgendes realisiert:

    #include <stdio.h>
    
    int main ( int argc, char **argv )
    {
    
    	FILE *p_teststream;
    	char buffer[100];
    
    	try
    	{
    		if ( p_teststream == NULL )
    			throw "Nicht genügend Arbeitsspeicher vorhanden\n";
    		if ( ( p_teststream = fopen("C:\\Dokumente und Einstellungen\\Administrator\\Desktop\\testconfig.ini", "rt") ) == NULL )
    			throw "Konnte Datei nicht \x99 \bffnen.\n";
    	}
    
    	catch ( char *s_error )
    	{
    		printf ("Ein Fehler ist aufgetreten:\n%s", s_error );
    		getchar();
    		return 1;
    	}
    
    	int i = 0;
    
    	do
    	{
    		fgets ( buffer, 100, p_teststream );
    		printf ( "%s", buffer );
    		i++;
    	} while ( !feof ( p_teststream ) );
    
    	printf ( "\n\n%i Lines Read", i );
    
    	getchar();
    	return 0;
    };
    


  • Hm, so ein blöder Fehler. Aber der Code stimmt schon. Ich will ja nichts in die Datei reinschreiben, sondern nur auslesen. Danke!



  • Pyro Phoenix schrieb:

    throw "Nicht genügend Arbeitsspeicher vorhanden\n";
    

    Es ist natürlich löblich, wenn du dich mit den ANSI-C-IO-Mechanismen auseinandersetzt. Sogar der AIX-C-Compiler würde das verstehen (auch wenn er sich über die leere Anweisung in Zeile 37 wundern würde).

    Aber: das ganze verliert an Sinn, wenn man dann C++-Features wie throw benutzt. Dann hätte man gleich ganz auf C++ setzen können (also zumindest das .h bei stdio.h weglassen).

    Nebenbei ist das eine sehr unnötige Verwendung von Exceptions, weil es in dem FAll auch gereicht hätte, den catch-Block in eine Funktion zu packen, und die aufzurufen statt throw zu sagen. Mit dieser einen Formulierung ist dein Programm (obwohl es so einfach ist) also für alle Platformen verloren, die keinen C++-Compiler haben, obwohl es eigentlich in Plain-C geschrieben ist.

    PS:
    In Zeile 11 wird der Vergleich auf NULL niemals zutreffen. Wolltest du den nicht nach dem Öffnen machen?



  • bgdnoy schrieb:

    Es ist natürlich löblich, wenn du dich mit den ANSI-C-IO-Mechanismen auseinandersetzt.

    Naja normalerweise fängt man auch mit den grundlagen an ...

    Hmm ich nenns mal Hybrid C:

    #include <stdio.h>
    
    int main ( int argc, char **argv )
    {
    
    	FILE *p_teststream = NULL;
    	char buffer[100];
    
    	try
    	{
    		if ( ( p_teststream = fopen("C:\\Dokumente und Einstellungen\\Administrator\\Desktop\\testconfig.ini", "rt") ) == NULL )
    			throw "Konnte Datei nicht \x99 \bffnen.\n";
    	}
    
    	catch ( char *s_error )
    	{
    		printf ("Ein Fehler ist aufgetreten:\n%s", s_error );
    		getchar();
    		return 1;
    	}
    
    	int i = 0;
    
    	do
    	{
    		fgets ( buffer, 100, p_teststream );
    		printf ( "%s", buffer );
    		i++;
    	} while ( !feof ( p_teststream ) );
    
    	printf ( "\n\n%i Lines Read", i );
    
    	getchar();
    	return 0;
    };
    

    ANSI C:

    #include <stdio.h>
    
    int main ( int argc, char **argv )
    {
    
    	FILE *p_teststream = NULL;
    	char buffer[100];
    
    	if ( ( p_teststream = fopen("C:\\Dokumente und Einstellungen\\Administrator\\Desktop\\testconfig.ini", "rt") ) == NULL )
    		return -1;
    
    	int i = 0;
    
    	do
    	{
    		fgets ( buffer, 100, p_teststream );
    		printf ( "%s", buffer );
    		i++;
    	} while ( !feof ( p_teststream ) );
    
    	printf ( "\n\n%i Lines Read", i );
    
    	getchar();
    	return 0;
    };
    


  • Ich dachte da eher an:

    int die(char *msg, int _exit)
    {
        printf(msg);
        getchar();
        exit(_exit);
    }
    
    int die_on_error(char *msg, int _exit)
    {
        printf("Ein Fehler ist aufgetreten:\n");
        die(msg, _exit);
    }
    
    int main(int c, char **v)
    {
        FILE *p_teststream = NULL;
    
        if (! (p_teststream = fopen("...", "r")))
            die_on_error("Konnte Datei nicht oeffnen.\n", -1);
    
        char buffer[100];
        long int i;
    
        do
        {
            fgets ( buffer, 100, p_teststream );
            printf ( "%s", buffer );
            i++;
        } while ( !feof ( p_teststream ) );
        sprintf(buffer, "\n\n%i Lines Read", i);
        die(buffer, 0);
    }
    

    PS: Nimm die leere Anweisung am Ende raus!


Log in to reply