C++ fstream will Datei nicht öffnen



  • // read a file into memory
    #include <iostream>     // std::cout
    #include <fstream>      // std::ifstream
    
    int main () {
    
      std::ifstream is ("test.txt", std::ifstream::binary);
      if (is) {
        // get length of file:
        is.seekg (0, is.end);
        int length = is.tellg();
        is.seekg (0, is.beg);
    
        char * buffer = new char [length];
    
        std::cout << "Reading " << length << " characters... ";
        // read data as a block:
        is.read (buffer,length);
    
        if (is)
          std::cout << "all characters read successfully.";
        else
          std::cout << "error: only " << is.gcount() << " could be read";
        is.close();
    
        // ...buffer contains the entire file...
    	std::cout << buffer;
    	system("PAUSE");
        delete[] buffer;
      }
      return 0;
    }
    

    Ist der letzte Codesnippet den ich probiert hab, hab aber auch noch zich andere Sachen probiert die auch alle nicht funktionieren. Das Programm schließt sich sofort da er die txt Datei nicht öffnen kann, habs mit relativem und absolutem Pfad probiert, beides geht nicht.

    Hier noch ein anderer Test

    char pfad[256]; //hier wird der Programmpfad gespeichert
    
    	_getcwd( pfad, 256); 
    	std::string truepfad;
    	truepfad = pfad;
    	truepfad.append("\\test.txt");
    	fstream f("C:\\Users\\Etix\\Documents\\test.txt"); 
        string s;
    	if (!f) 
       std::cout << truepfad;
    	else
    	{
    		std::cout << "open file";
    		while (getline(f, s)){
    			std::cout << s;
    		}
    	}
    

    Mit dem ausgelesenen Pfad der 100% richtig sein muss gehts auch nicht, bin grad echt ratlos 😡



  • Also bei mir gehts unter Win8 mit dem Cygwin GCC 4.8.1.
    Hast du vielleicht die Datei schreibgeschützt oder sowas? Vielleicht was mit Adminrechten?



  • Wenn du Flags mit angibst, werden die default-Flags im Konstruktor überschrieben. Du musst also auch ios::in oder ios::out mit angeben. Die Reihenfolge ist dabei ebenfalls wichtig, habe ich aber grad nicht im Kopf.


  • Mod

    Gastpost schrieb:

    Wenn du Flags mit angibst, werden die default-Flags im Konstruktor überschrieben. Du musst also auch ios::in oder ios::out mit angeben. Die Reihenfolge ist dabei ebenfalls wichtig, habe ich aber grad nicht im Kopf.

    Das ist kompletter Stuss.



  • Naja, hat bei mir zumindest mal so ein ähnliches Problem gelöst:

    Zitat aus http://www.cplusplus.com/doc/tutorial/files/:

    For fstream, the default value is only applied if the function is called without specifying any value for the mode parameter. If the function is called with any value in that parameter the default mode is overridden, not combined.

    File streams opened in binary mode perform input and output operations independently of any format considerations. Non-binary files are known as text files, and some translations may occur due to formatting of some special characters (like newline and carriage return characters).

    Since the first task that is performed on a file stream is generally to open a file, these three classes include a constructor that automatically calls the open member function and has the exact same parameters as this member.

    Aber ich lasse mich gerne eines besseren belehren, falls ich Begriffe durcheinander geworfen habe.


  • Mod

    fstream != ifstream. Außerdem möchte ich doch gerne mal wissen, seit wann bitweises ODER nicht mehr assoziativ sein soll. Du hast wahrscheinlich irgendwas anderes bei dir falsch gemacht, hast wild rumprobiert, irgendwann funktionierte es zufällig und nun glaubst du irgendwas daraus gelernt zu haben, dabei war es einfach nur Zufall.

    PS: In deinem Link, bloß ein bisschen weiter gelesen, wird es richtig erklärt:

    For ifstream and ofstream classes, ios::in and ios::out are automatically and respectively assumed, even if a mode that does not include them is passed as second argument to the open member function (the flags are combined).



  • Würde mich wundern, wenn
    out|binary
    was anderes ergäbe als
    binary|out

    Dann müßte ich den operator| wegwerfen und mir einen neuen kaufen.



  • Gastpost schrieb:

    Wenn du Flags mit angibst, werden die default-Flags im Konstruktor überschrieben. Du musst also auch ios::in oder ios::out mit angeben.

    Mach ich nie bei ifstream und ofstream und es klappt trotzdem.


Log in to reply