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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top