Domanda

So che c'è stata una manciata di domande riguardanti std :: ifstream :: Open (), ma le risposte non hanno risolto il mio problema. La maggior parte di loro erano specifici per Win32, e sto usando SDL, non toccare qualsiasi funzionalità specifiche del sistema operativo (... che non è avvolto in SDL).

Il problema è: std :: :: ifstream open () non sembra funzionare più da quando sono passato da Dev-C ++ per Code :: Blocks (sono stato utilizzando lo stesso back-MinGW GCC terminare con entrambi), e da Windows XP a Vista. (Funziona perfettamente anche con OS X / Xcode (GCC back-end).)

I miei links del progetto nei confronti di una libreria statica che # include , , e , quindi viene effettuata una chiamata a funzionalità definite nella libreria statica, che a sua volta chiama std :: ifstream :: open () (questa volta, direttamente). In seguito, il flusso è falsa (sia con l'operatore di conversione implicita bool e il metodo buono ()).

Codice:

#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 dice:

  

Apertura 'D: / I miei progetti / Test / test.cfg' ...

Quando apro stdcout.txt, e copia-incollare il percorso con il nome del file in menu Start / Esegui, il file viene aperto come dovrebbe essere (io non sono del tutto sicuro di come gran parte di questo valore diagnostico è, però, anche, l'indirizzo è convertito nel seguente formato: file: /// D:. /My%20projects/test/test.cfg)

Inoltre ho provato a sostituire '/' s con la sequenza di escape doppia barra rovesciata (ancora una volta, tagli funzionavano perfettamente prima), ma il risultato era lo stesso.

è una versione di debug, ma sto usando tutto, percorso assoluto tratto da main () 's argv [0].

Dove sto andando male e che cosa ho bisogno di fare per risolvere il problema?

È stato utile?

Soluzione

ho supervisionato l'importanza del fatto che la funzione in questione ha close () D il flusso senza controllare se is_open ().

Il fatto che si imposterà fail_bit del flusso (causando di valutare a false) ero del tutto nuovo per me (non che si tratta di una scusa è), e io ancora non capisco perché ha fatto questo lavoro codice prima.

In ogni caso, il C ++ di riferimento è abbastanza chiaro su di esso; il problema è ora risolto.

Altri suggerimenti

  1. Si prega di creare un insieme minimo che ricrea il problema. Ad esempio, nel codice sopra c'è l'analisi di argv e concatenazione fra stringhe, che non sembrano come una parte necessaria della questione. Un insieme minimo aiuterebbe voi (e noi) vedere esattamente cosa sta andando male, e non essere distratti da domande come "cosa c'è GetPath ()?".
  2. Provate a fare questo, invece di assert(infile.good()):

    assert (filein);

Il seguente codice:

#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;
}

funziona bene sul mio sistema di Windows usando MinGW g ++ 4.4.0, se creo la struttura di directory richiesta. Ha il file test.cfg in realtà esiste? Se si sta aprendo un flusso per l'ingresso, si wioll esito negativo se il file non c'è.

Modifica Per eliminare ogni DevC ++ a questioni CB:

  • costruire utilizzando solo riga di comando
  • assicurarsi di ricostruire la libreria statica troppo
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top