Pregunta

Sé que ha habido un puñado de preguntas con respecto a std :: ifstream :: Open (), pero las respuestas no resolvió mi problema. La mayoría de ellos eran específicos para Win32, y estoy usando SDL, sin tocar ninguna funcionalidad específica del SO (... eso no está envuelto en SDL).

El problema es: std :: :: ifstream abierta () no parece que trabajar más ya que he cambiado de Dev-C ++ para Code :: Blocks (He estado usando la misma fuente Back-MinGW GCC terminar con ambos), y desde Windows XP a Vista. (También funciona perfectamente con OS X / Xcode (CCG back-end).)

Mi Proyecto enlaces contra una biblioteca estática que #Includes , , y , a continuación, se hace una llamada a la funcionalidad definida en la biblioteca estática, que a su vez llama a std :: ifstream :: Open () (esta vez, directamente). Después de esto, la corriente se evalúa como falsa (tanto con el operador de conversión bool implícito y el método bueno ()).

Código:

#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: / Mis proyectos / Prueba / test.cfg' ...

Al abrir stdcout.txt, y copiar y pegar la ruta con el nombre de archivo en el menú Inicio / Ejecutar, el archivo se abre como debe ser (no estoy del todo seguro de qué parte de este valor diagnóstico es, sin embargo, también, la dirección se convierte en el siguiente formato: file: /// D:. /My%20projects/test/test.cfg)

También he intentado sustituir '/' s con la secuencia de escape de doble barra invertida (de nuevo, barras funcionaron bien antes), pero el resultado fue el mismo.

es una versión de depuración, pero estoy usando el conjunto, ruta absoluta tomada desde main () 's argv [0].

Estoy

A dónde voy mal y lo que necesito para hacer para solucionarlo?

¿Fue útil?

Solución

He supervisado la importancia del hecho de que la función en cuestión tiene cerca (a) d la corriente sin comprobar si is_open ().

El hecho de que se fijará fail_bit de la corriente (haciendo que se evalúa como falsa) era totalmente nuevo para mí (que no es que sea una excusa es), y todavía no entiendo por qué hizo este trabajo código antes.

De todos modos, el C ++ referencia es bastante claro en él; el problema ya está resuelto.

Otros consejos

  1. Por favor, crear un conjunto mínimo que recrea el problema. Por ejemplo, en el código anterior hay análisis de argv y concatenación de cuerdas, que no se parecen como una parte necesaria de la cuestión. Un conjunto mínimo ayudaría a usted (y nosotros) ver exactamente lo que va mal, y no se distraiga con preguntas como "¿cuál es GetPath ()?".
  2. Trate de hacer esto en vez de assert(infile.good()):

    assert (infile);

El siguiente código:

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

funciona bien en mi sistema Windows utilizando MinGW g ++ 4.4.0, si puedo crear la estructura de directorios necesaria. Existe realmente la test.cfg archivo? Si va a abrir un flujo de entrada, wioll fallar si el archivo no está allí.

Editar Para eliminar cualquier DevC ++ para cuestiones CB:

  • construir utilizando sólo la línea de comandos
  • asegurarse de que la reconstrucción de la biblioteca estática demasiado
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top