ifstream :: abierta no funciona en modo de depuración de Visual Studio
-
18-09-2019 - |
Pregunta
He estado en todas partes las preguntas ifstream aquí en la SO y todavía estoy teniendo problemas para leer un archivo de texto simple. Estoy trabajando con Visual Studio 2008.
Aquí está mi 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;
}
Me han confirmado que el entrada.txt archivo está en el "directorio de trabajo" correcta comprobando el valor de argv[0]
. El método Open no va a funcionar.
También estoy teniendo problemas para debugging- debería no ser capaz de establecer una vigilancia sobre infile.good()
o infile.is_open()
? Sigo recibiendo
Error: member function not present.
EDIT:. código actualizado lista con código completo del archivo .cpp
ACTUALIZACIÓN: El archivo no estaba en el directorio de trabajo actual. Este es el directorio donde archivo de proyecto se encuentra el. Se trasladó allí y funciona al depurar en VS.NET.
Solución
Trate de usar el operador binario OR cuando se especifica el modo de apertura.
infile.open ("input.txt", ios::ate | ios::in);
El href="http://www.cplusplus.com/reference/iostream/ios_base/openmode/" rel="nofollow noreferrer"> openmode parámetro es una máscara de bits. ios::ate
se utiliza para abrir el archivo para anexar y ios::in
se utiliza para abrir el archivo para leer la entrada.
Si lo que desea es leer el archivo, probablemente puede utilizar:
infile.open ("input.txt", ios::in);
El modo de apertura predeterminado para una ifstream es ios :: in, por lo que puede deshacerse de que en total ahora. El siguiente código está trabajando para mí 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;
}
Otros consejos
A veces Visual Studio pone su archivo EXE lejos de su código fuente. Por defecto VS sólo se puede buscar el archivo a partir de su archivo EXE. Este proceso es un paso simple para obtener el archivo txt de entrada desde el mismo directorio que el código fuente. En caso de que no desea arreglar su configuración 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 esto ayuda a otras personas para una solución rápida. Me tomó un tiempo para encontrar esta configuración por nosotros mismos.
He encontrado dos problemas en su código:
a) error de sintaxis en "ios :: comió || ios :: in" => debe ser "ios :: comieron | ios :: en"
b) "ios :: comieron" establece el cursor hasta el final del archivo - por lo que no reciben nada cuando se inicia la lectura
Así que sólo eliminan "ios :: comieron" y que están muy bien:)
ciao, Chris
infile.open ("input.txt", ios::ate || ios::in);
||
es el operador lógico OR, no el operador de bits (como dijo Bill El Lizzard).
Así que supongo que está haciendo el equivalente a:
infile.open ("input.txt", true);
(suponiendo ni ios :: comió o ios :: en son 0)
Trate de usar:
ifstream fStm("input.txt", ios::ate | ios::in);
También estoy teniendo problemas para debugging- qué no iba a ser capaz de establecer una vigilancia sobre "infile.good ()" o "infile.is_open ()"? Me pone "Error:. Función miembro no está presente"
e incluye el correcto:
#include <fstream>
etc.