ifstream :: open não funciona no modo de depuração Visual Studio
-
18-09-2019 - |
Pergunta
Eu estive em todo as perguntas ifstream aqui no SO e ainda estou tendo problemas para ler um arquivo de texto simples. Eu estou trabalhando com o Visual Studio 2008.
Aqui está o meu código:
// CPPFileIO.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <fstream>
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ifstream infile;
infile.open("input.txt", ifstream::in);
if (infile.is_open())
{
while (infile.good())
cout << (char) infile.get();
}
else
{
cout << "Unable to open file.";
}
infile.close();
_getch();
return 0;
}
Eu confirmei que o input.txt arquivo está no "diretório de trabalho" correta, verificando o valor de argv[0]
. O método Open simplesmente não vai funcionar.
Eu também estou tendo problemas debugging- que eu não deveria ser capaz de definir um relógio em infile.good()
ou infile.is_open()
? Recebo
Error: member function not present.
EDIT:. código listagem atualizada com código completo do arquivo .CPP
UPDATE: O arquivo não estava no diretório de trabalho atual. Este é o diretório onde o arquivo de projeto está localizado. Mudou-se lá e ele funciona quando a depuração no VS.NET.
Solução
Tente usar o bit a bit OR operador ao especificar o modo aberto.
infile.open ("input.txt", ios::ate | ios::in);
O openmode parâmetro é uma máscara de bits. ios::ate
é usado para abrir o arquivo para acrescentar, e ios::in
é usado para abrir o arquivo para leitura de entrada.
Se você só quer ler o arquivo, você provavelmente só pode usar:
infile.open ("input.txt", ios::in);
O modo de abertura padrão para um ifstream é ios :: in, assim você pode se livrar desse completamente agora. O código a seguir está funcionando para mim usando g ++.
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
int main(int argc, char** argv) {
ifstream infile;
infile.open ("input.txt");
if (infile)
{
while (infile.good())
cout << (char) infile.get();
}
else
{
cout << "Unable to open file.";
}
infile.close();
getchar();
return 0;
}
Outras dicas
Às vezes, Visual Studio coloca o arquivo exe longe de seu código-fonte. Por padrão VS só pode procurar o arquivo a partir de seu arquivo exe. Este processo é um passo simples para obter o arquivo txt de entrada a partir do mesmo diretório que o seu código-fonte. você não deve querer corrigir sua configuração IDE.
using namespace std;
ifstream infile;
string path = __FILE__; //gets source code path, include file name
path = path.substr(0,1+path.find_last_of('\\')); //removes file name
path+= "input.txt"; //adds input file to path
infile.open(path);
Esperamos que isso ajude outras pessoas para uma solução rápida. Levei um tempo para encontrar essa configuração sozinho.
Eu encontrei dois problemas em seu código:
a) erro de sintaxe no "ios :: comeu || ios :: in" => deve ser "ios :: comeu | ios :: em"
b) "ios :: comeu" Define o cursor para o fim do arquivo - assim você não ganha nada quando você começar a ler
Então, basta remover "ios :: comeu" e você está bem:)
ciao, Chris
infile.open ("input.txt", ios::ate || ios::in);
||
é o lógico ou operador, não o operador bit a bit (como disse Bill A Lizzard).
Então eu acho que você está fazendo o equivalente a:
infile.open ("input.txt", true);
(assumindo que nem ios :: comeu ou ios :: in são 0)
Tente usar:
ifstream fStm("input.txt", ios::ate | ios::in);
Eu também estou tendo debugging- problemas que eu não deveria ser capaz de definir um relógio em "infile.good ()" ou "infile.is_open ()"? Eu continuo recebendo "Erro:. Função de membro não está presente"
e inclui o correcto:
#include <fstream>
etc.