Ofstream - Dateiausgabe



  • Hi bin neu hier, wir haben eine Programmierübung. Ich habe sie mit Visual Studio 2008 gemacht und kompiliert. Es kommen auch keine Fehler. Bei einer Teilaufgabe hab ich noch ein Problem:

    Aufgabe 1A):

    Schreiben Sie eine kleine Funktion createTestFile(), die eine neue Datei
    „tmp.txt“ im aktuellen Verzeichnis anlegt und einen kleinen Text in die Datei
    schreibt. Der Text sollte insbesondere folgende Elemente enthalten:
    Zeilenumbrüche, Tabulatoren, Umlaute.
    Testen Sie die Funktion, indem Sie sich das Ergebnis mit einem Texteditor
    anschauen. Jetzt wollen wir es aber genauer wissen: Wie ist der Text tatsächlich
    auf Byte-Ebene codiert?

    void createTestFile() {
    ofstream of("tmp.txt");
    of << "abc\tdef\nghi" << endl << "äöüß";
    of.close();
    }

    (includes hab ich weggelassen, jedoch im meinem Gesamtcode drin)

    das hab ich als code geschriebn. Visual Studio nimmts auch an, das Problem ist, ich finde nirgendswo die tmp.txt. Die erstellt er mir quasi nicht. (Der gesamte Code der Aufgabe ist natürlich länger, da hat auch alles geklappt nur bei der Teilaufgabe nicht)

    Liegt es vllt an den Einstellung von Visuals Studio das es nicht klappt?


  • Mod

    Such mal genauer, dein Code ist an sich richtig. Denk daran, dass die Datei im aktuellen Verzeichnis erstellt wird. Je nachdem, wie du dein Programm startest, kann das etwas ziemlich unerwartetes sein.

    P.S.: Für Code nimmt man am Besten die CPP-Tags (links unter den Smileys, dann kann man das viel besser lesen, schau mal:

    void createTestFile() {
     ofstream of("tmp.txt");
     of << "abc\tdef\nghi" << endl << "äöüß";
     of.close();
    }
    


  • Normalerweise (wenn du nix an den Einstellungen änderst) sollte die Datei im Verzeichnis, wo die Projektdateien liegen vorhanden sein. (Wenn du von der IDE aus startest)
    Ansonsten befindet sich die Datei im Ordner, wo du die .exe startest.



  • Hallo

    welches BS verwendest du

    Mfg
    Klaus



  • Windows XP Professional verwende ich.



  • Hallo

    und ueber die SF von WinXP findest du
    die Datei nicht

    Mfg
    Klaus



  • Das ist mein gesamter Code von meiner Aufgabe:

    #include <iostream>
    #include <iomanip>
    #include <fstream>
    #include <string>
    #include <limits>
    using namespace std;
    
    class FileAnalyzer {
    private:
    
    	ifstream stream;
    
    	unsigned char* buffer;
    
    	int bSize;
    
    	int bLength;
    
    	int bOffset;
    
    	int columns;
    
    	void printLine(int bIdxFrom, int bIdxTo);
    
    public:
    
    	FileAnalyzer(string fileName, int cols = 10, int rows = 20);
    
    	~FileAnalyzer();
    
    	bool hasMoreData();
    
    	void analyze(int offset);
    
    	void analyzePrev();
    
    	void analyzeNext();
    
    	void analyzeAll();
    };
    
    FileAnalyzer::FileAnalyzer(string fileName, int cols, int rows)
    	: bSize(cols * rows), bLength(0), bOffset(0), columns(cols) {
    	stream.open(fileName.c_str(), ios::in | ios::binary);
    	buffer = new unsigned char[bSize];
    }
    
    FileAnalyzer::~FileAnalyzer() {
    	stream.close();
    	delete[] buffer;
    }
    
    bool FileAnalyzer::hasMoreData() {
    	return !stream.eof();
    }
    
    void FileAnalyzer::analyze(int offset) {
    	char c;
    	bOffset = offset;
    	if (stream.fail())
    		stream.clear(); 
    	stream.seekg(bOffset); 
    
    	for (bLength = 0; stream.get(c) && bLength < bSize; bLength++) {
    		buffer[bLength] = c;
    	}
    
    	for (int idx = 0; idx < bLength; idx+=columns)
    		printLine(idx, min(bLength, idx+columns));
    }
    
    void FileAnalyzer::analyzePrev() {
    	analyze(max(bOffset-bSize, 0));
    }
    
    void FileAnalyzer::analyzeNext() {
    	if (hasMoreData()) 
    		bOffset+=bSize;
    	analyze(bOffset);
    }
    
    void FileAnalyzer::analyzeAll() {
    	analyze(0);
    	while (hasMoreData())
    		analyzeNext();
    }
    
    void FileAnalyzer::printLine(int bIdxFrom, int bIdxTo) {
    
    	cout << setw(8) << bOffset + bIdxFrom << ": " << hex;
    
    	for (int i = bIdxFrom; i < bIdxFrom + columns; i++) {
    		if (i < bIdxTo)
    			cout << setw(2) << (short) buffer[i] << " ";
    		else
    			cout << "   ";
    	}
    	cout << dec << "  |   ";
    
    	for (int i = bIdxFrom; i < bIdxTo; i++) {
    		if (buffer[i] >= 0x20 && buffer[i] < 0x7f) 
    			cout << buffer[i]; 
    		else
    			cout << "?"; 
    	}
    	cout << endl;
    }
    
    void createTestFile() {
    	ofstream of("tmp.txt");
    	of << "abc\tdef\nghi" << endl << "äöüß";
    	of.close();
    }
    
    int main() {
    
    	int choice = 4;
    	int pos = 0;
    	string fileName;
    	cout << "File Analyzer\nSpecify a file and I show you every bit of it!"
    		<< "\n\nfile name: ";
    	cin >> fileName;
    	FileAnalyzer f(fileName);
    	do {
    		cout << endl;
    		switch (choice) {
    			case 1:
    				f.analyzePrev(); break;
    			case 2:
    				f.analyzeNext(); break;
    			case 3:
    				f.analyzeAll(); break;
    			case 4:
    				f.analyze(pos);
    		}
    		cout << "\n(1) prev   (2) next   (3) all   (4) specify pos   (0) exit : ";
    		cin >> choice;
    		if (choice == 4) {
    			cout << "position: ";
    			cin >> pos;
    		}
    		if (cin.fail()) { 
    			cin.clear();  
    			cin.ignore(std::numeric_limits<int>::max(),'\n'); 
    			choice = -1;  
    		}
    	} while (choice != 0);
    }
    

    Die Klasse bin ich gewohnt immer zusammen mit in eine Datei reinzupacken weil ich mit dem Class-Wizard nicht zurecht komme.



  • Jetzt wollen wir es aber genauer wissen: Wie ist der Text tatsächlich auf Byte-Ebene codiert?

    wer denkt sich denn so ne aufgabe aus? was will der denn da wissen? ascii?!
    implementierungs- bzw. plattform-abhängig?

    ich hoffe, in der original-aufgabenstellung ist das besser formuliert.
    ansonsten würd ich ihm genau so antworten, wie er fragt:
    "ist mit 0en und 1en codiert..."

    deine datei sollte wie gesagt im selben ordner liegen, in dem auch dein projekt liegt(ggf noch eine ebene tiefer, wenn du den haken am anfang("create subdirectory" oder so ähnlich) nicht rausgemacht hast)...
    wenn das nicht der fall ist, guck mal, was bei working-directory eingetragen ist(rechtsklick im solutionexplorer auf deinen projektnamen -> propertys -> debugging -> worikng directory)

    bb

    edit:
    rechtsklick im solutionexplorer auf deinen projektnamen(das fette) -> propertys -> debugging -> worikng directory -> linksklick in das feld -> <Browse>



  • rechtsklick im solutionexplorer auf deinen projektnamen(das fette) -> propertys -> debugging -> worikng directory -> linksklick in das feld -> <Browse>

    Also das hab ich jetzt gemacht und extra da mein Ordner eingetippt, aber da war es dann immer noch nicht wo ich es nochmal durchlaufen lassen hab...


  • Mod

    unskilled schrieb:

    ich hoffe, in der original-aufgabenstellung ist das besser formuliert.
    ansonsten würd ich ihm genau so antworten, wie er fragt:
    "ist mit 0en und 1en codiert..."

    Nicht, wenn die Datei beispielsweise mein Drucker ist...

    Ist tatsächlich nicht zu beantworten, diese Frage.



  • Quattle schrieb:

    rechtsklick im solutionexplorer auf deinen projektnamen(das fette) -> propertys -> debugging -> worikng directory -> linksklick in das feld -> <Browse>

    Also das hab ich jetzt gemacht und extra da mein Ordner eingetippt, aber da war es dann immer noch nicht wo ich es nochmal durchlaufen lassen hab...

    dann guck mal, was is_open() (oder good() - ist egal, was von beiden) zurückliefert...

    bis gleich ;o)



  • also is_open() einfach in meinen code hinzufügen?



  • void createTestFile() { 
        ofstream of("tmp.txt"); 
        of << "abc\tdef\nghi" << endl << "äöüß"; 
        of.close(); 
    }
    

    hier z.bsp. ein
    std::cout << "Geoeffnet: " << of.is_open() << std::endl;
    hinzufügen.(nach dem ofstream of(...) und vor dem of.close() . Und dann sagen, was auf der Konsole stand...
    das of.close() ist übrigens überflüssig.

    bb



  • Also ich habs hinzugfügt, komischerweise zeigt er in der Konsole nichts anderes an. Mir kommt das jetzt echt komisch vor



  • Ist nicht dein Ernst, oder? Wer kommt denn bitte darauf, dass du die Fkt nicht mal aufrufst, die die Datei erzeugt? xD

    Von wem hast du den Quelltext denn kopiert? Langsam scheint es mir so, als ob das nicht selbst geschrieben haben kannst...

    bb



  • In deinen Quelltext wird die Funktion in der main nicht aufgerufen..



  • moinaufruf schrieb:

    In deinen Quelltext wird die Funktion in der main nicht aufgerufen..

    danke, dass du das noch mal so klar formulierst - vll war meine aussage ja zu schwammig... ~~


Log in to reply