Probleme beim Lesen mit read und write



  • Hey @all,

    und zwar habe ich das Problem wenn ich jetzte folgende Datei schreibe

    <TAG><SIZE><VALUE> also in etwas so
    NAME§irgendetwasVNAM(nochmalirgendetwas
    

    wie kann ich diese mit read lesen?
    Denn folgendes liefert bei mir nur falsche Ausgaben:

    fstream file("test.dat", ios::binary | ios::in);
    char tag[4] = {'\0'};
    char size[1] = {'\0'};
    file.read(tag, 4);
    file.read(size, 1);
    int isize;
    stringstream s;
    s << size;
    s >> isize;
    char* text = new char[isize+1];
    file.read(text, isize);
    

    Lg _freeze_



  • Was für eine Ausgabe bekommst du den?
    Du liest aber soviel Daten ein, dass damit der komplette buffer gefüllt ist, damit fehlt ein \0 am Stringende



  • salut,

    hab ein kleines Problem, und zwar verstehe ich nicht wieso bei diesem Programm, nur die ersten 4 Zeichen kopiert werden und nicht das ganze file....

    #include <iostream>
    #include <ctime>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define BUFFER_SIZE 8192
    
    void usage(char * name); //Initialisiere Funktion
    
    void start_clock(clock_t & time);//Initialisierung
    void print_time_used(clock_t time);//Initialisierung
    
    bool GetThreadTimes( );
    
    int main(int argc, char * argv[])
    {
    	system("cls");
    	char antwort;
    	FILE *ausgabe,*eingabe;
    	int n=0;
    	char buffer[BUFFER_SIZE];
    	clock_t time=0; //Zeit auf 0 gesetzt
    
    	std::cout << "******************************************\n" <<std::endl;
        if(argc != 3) usage(argv[0]); //überprüfe ob Parameterzahl ungleich 3 ist
    
        if((eingabe = fopen(argv[1], "r")) == (FILE *) NULL)//überprüfe Parameter 1 (Eingabedatei)
        {		
    
    		std::cout <<"Eingabedatei existiert nicht!"<<std::endl;
    		exit(-1);
        }
    
        if((ausgabe = fopen(argv[2],"r")) != (FILE *) NULL)//Überprüfe ob Ausgabedatei geöffnet werden kann
        {
    
    		std::cout <<"Die Ausgabedatei existiert schon!\nSoll sie trotzdem ueberschrieben werden? (j/n) " << std::endl;
    		std::cin >>antwort;
    		fclose(ausgabe); //schliesse die Ausgabedatei
    
    		if((antwort != 'j')&&(antwort != 'J'))//überprüfe ob Eingabe ungleich j/J ist...
    		{
    			std::cout << "\nKopiervorgang unterbrochen." <<std::endl;
    			exit(-1);
    		}
    		else					
    		{	
    			ausgabe=fopen(argv[2], "w");
    		}
    
        }
    
        if((ausgabe = fopen(argv[2],"w")) == (FILE *) NULL)//Öffne Datei zum schreiben...
        {
    		std::cout << "Outputfile kann nicht geschrieben werden." << std::endl;
            usage(argv[0]);
    
        }
    	else
    	{
    		start_clock(time);
    		n=fread(buffer, 1, sizeof(BUFFER_SIZE), eingabe);
    		//std::cout << n;
    		std::cout <<buffer;
    
    		if(buffer==NULL)
    		{
    			std::cout <<"kein Speicher vorhanden"<<std::endl;
    
    		}
    		else
    		{
    				do
    				{
    				std::cout <<n;
    				fwrite(buffer, 1, n, ausgabe);//fwrite(buffer, 1, n, ausgabe);
    				n--;
    				}while(n>NULL);
    
    		fclose(ausgabe);//Schliesse die Ausgabedatei
    		fclose(eingabe);//Schliesse die Eingabedatei
    		}
    	}
    	std::cout <<"\nKopie wurde erstellt!" << std::endl;
    	printf("%d ", sizeof(buffer));
    	print_time_used(time);
    	return EXIT_SUCCESS;
    
    }
    
    void usage(char *name)//Ausgabe, falls Parameterübergabe falsch oder nicht vollständig eingegeben wurde
    {
    	std::cout << "Parameter Fehler!" << std::endl;
        exit(8);
    }
    
    void start_clock(clock_t &time)//start_clock Funktion, initialisiert die Zeit
    {
    	time= clock();
    	if(time==clock_t(-1))
    	{
    		std::cerr << "sorry, no clock";
    		exit(1);
    	}
    	return;
    }
    
    void print_time_used(clock_t time)//print_time_used, zeigt die Differenz zwischen startzeit + endzeit
    {
    	clock_t time2 = clock();
    	if(time2 == clock_t(-1))
    	{
    		std::cerr <<"sorry, clock overflow";
    		exit(2);
    	}
    	std::cout << "\nKopierdauer: " << 10000*double(time2-time)/CLOCKS_PER_SEC
    		<<" Millisekunden" <<std::endl;
    	return;
    }
    

    hoffe ihr könnt mir weiterhelfen...

    mfg

    beatrice


Anmelden zum Antworten