Pergunta

Eu sei que tem havido um punhado de perguntas sobre std :: ifstream :: open (), mas as respostas não resolveu o meu problema. A maioria deles eram específicos para Win32, e eu estou usando SDL, não tocar em qualquer funcionalidade específica de OS (... isso não é embrulhado em SDL).

O problema é: std :: ifstream :: open () parece não funciona mais desde que eu tenha mudado de Dev-C ++ para Code :: Blocks (Eu tenho usado o mesmo MinGW-GCC back- terminar com ambos), e a partir do Windows XP para o Vista. (Ele também funciona perfeitamente com o OS X / Xcode (GCC back-end).)

As minhas ligações projeto contra uma biblioteca estática que #includes , , e , em seguida, é feita uma chamada para a funcionalidade definida na biblioteca estática, o que por sua vez chamadas std :: ifstream :: open () (desta vez, diretamente). Em seguida, os avalia fluxo false (tanto com o operador de conversão implícita bool eo método bom ()).

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 diz:

abertura 'D: / Meus projetos / Teste / test.cfg' ...

Quando eu stdcout.txt aberta, e copie e cole o caminho com o nome do arquivo no menu Iniciar / Executar, o arquivo é aberto como deveria ser (eu não sou inteiramente certo o quanto de valor diagnóstico é que, também, o endereço é convertido para o seguinte formato: file: /// D:. /My%20projects/test/test.cfg)

Eu também tentei substituindo '/' s com a sequência de escape barra invertida dupla (mais uma vez, barras funcionou bem antes), mas o resultado foi o mesmo.

é a versão de depuração, mas eu estou usando todo o caminho, absoluta retirado argv main () 's [0].

Para onde estou indo errado eo que eu preciso fazer para corrigir isso?

Foi útil?

Solução

Eu tenho supervisionado a importância do fato de que a função em questão tem close () d o fluxo sem verificar se nome esta_aberta ().

O fato de que ele irá definir fail_bit do fluxo (causando-lo para avaliar como false) era totalmente novo para mim (não é que é uma desculpa), e eu ainda não entendo por que fez este trabalho de código antes.

De qualquer forma, a referência c ++ é bastante clara sobre ele; o problema já está resolvido.

Outras dicas

  1. Por favor, crie um conjunto mínimo que recria o problema. Por exemplo, no código acima não é a análise de argv e corda concatentation, que não parecem ser uma parte necessária da questão. Um conjunto mínimo iria ajudá-lo (e nós) ver exatamente o que está acontecendo de errado, e não se distrair com perguntas como "o que é GetPath ()?".
  2. Tente fazer isso em vez de assert(infile.good()):

    assert (infile);

O código a seguir:

#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 bem no meu sistema Windows usando MinGW g ++ 4.4.0, se eu criar a estrutura de diretório necessário. O test.cfg arquivo realmente existe? Se você está abrindo um fluxo de entrada, ele wioll falhar se o arquivo não está lá.

Editar: Para remover qualquer DevC ++ para questões CB:

  • compilação usando linha de comando só
  • Certifique-se que você reconstruir a biblioteca estática demasiado
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top