Frage

Ich weiß, dass es eine Handvoll Fragen ist schon in Bezug auf std :: ifstream :: open (), aber die Antworten nicht mein Problem lösen. Die meisten von ihnen waren spezifisch für Win32, und ich bin mit SDL, keine OS-spezifische Funktionalität zu berühren (... das ist nicht in SDL verpackt).

Das Problem ist: std :: ifstream :: open () scheint nicht mehr zu arbeiten, da ich von Dev-C ++ Code :: Blocks gewechselt haben (ich war die gleiche MinGW-GCC Hinter- mit Ende mit beiden), und von Windows XP auf Vista. (Es funktioniert auch perfekt mit OS X / Xcode (GCC Back-End).)

Mein Projekt mit einer statischen Bibliothek, die #include , , und , dann wird ein Aufruf an Funktionalität in der statischen Bibliothek, die wiederum ruft std :: definiert gemacht ifstream :: open () (diesmal direkt). Im Anschluss wertet der Strom auf false (sowohl mit dem impliziten Bool Umwandlungsoperator und dem guten () -Methode).

Code:

#include "myStaticLibrary.hpp"

int main(int argc, char **argv)
{
  std::string filename("D:/My projects/Test/test.cfg");

  std::cout << "opening '" << filename << "'..." << std::endl;
  bool success(false);

  // call to functionality in the static library
  {
    std::ifstream infile(filename.c_str());
    success = infile.good();
    // ...
  }
  // success == false;

  // ...
  return 0;
}

stdcout.txt sagt:

  

Öffnen 'D: / Meine Projekte / Test / test.cfg' ...

Wenn ich öffne stdcout.txt und copy-paste den Pfades mit dem Dateinamen in Startmenü / Ausführen, die Datei als geöffnet sein sollte (ich bin mir nicht ganz sicher, wie viel von diagnostischem Wert dies ist jedoch, auch, Datei: die Adresse im folgenden Format umgewandelt wird /// D:. /My%20projects/test/test.cfg)

Ich habe auch versucht, ‚/‘ s mit der doppelten Backslash-Escape-Sequenz ersetzt wird (wieder, Schrägstriche funktionierten gut vor), aber das Ergebnis war das gleiche.

Es ist eine Debug-Version, aber ich bin mit dem ganzen, absolutem Pfad von der Haupt genommen () 's argv [0].

Wo bin ich falsch läuft und was muss ich tun, um es zu beheben?

War es hilfreich?

Lösung

Ich habe die Bedeutung der Tatsache, dass die betreffende Funktion beaufsichtigt hat close () d den Strom, ohne zu überprüfen, ob es istAuf ().

Die Tatsache, dass es dem Stream des fail_bit gesetzt wird (wodurch es zu falsch bewerten) war mir völlig neu (es ist nicht, dass es eine Entschuldigung), und ich verstehe immer noch nicht, warum, bevor Sie diesen Code Arbeit getan hat.

Wie auch immer, die c ++ Referenz ist ganz klar darauf; das Problem ist nun behoben.

Andere Tipps

  1. Erstellen Sie eine minimale Menge, die das Problem erschafft. Zum Beispiel oben in Ihrem Code gibt es Parsen von argv und String concatentation, die wie ein notwendiger Teil der Frage offenbar nicht. Eine minimale Menge würde helfen, (und uns) genau sehen, was falsch läuft, und nicht durch Fragen wie „was ist GetPath ()?“ Abgelenkt werden.
  2. Versuchen Sie dies statt assert(infile.good()) zu tun:

    assert (infile);

Mit dem folgenden Code:

#include <string>
#include <iostream>
#include <fstream>
#include <assert.h>
using namespace std;;

int main(int argc, char **argv)
{
  std::string filename("D:/My projects/Test/test.cfg");
  std::cout << "opening '" << filename << "'..." << std::endl;
  std::ifstream infile(filename.c_str());
  assert(infile.good()); // fails

  return 0;
}

funktioniert auf meinem Windows-System mit MinGW g ++ 4.4.0, wenn ich die erforderlichen Verzeichnisstruktur erstellen. Ist die Datei test.cfg wirklich? Wenn Sie einen Stream für die Eingabe öffnen, wioll es fehlschlagen, wenn die Datei nicht vorhanden ist.

Edit: jede DEVC entfernen ++ zu CB Problemen:

  • bauen nur mit der Befehlszeile
  • sicherstellen, dass Sie die statische Bibliothek neu erstellen zu
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top