ifstream::open not working in Visual Studio debug mode
Solution 1
Try using the bitwise OR operator when specifying the open mode.
infile.open ("input.txt", ios::ate | ios::in);
The openmode parameter is a bitmask. ios::ate
is used to open the file for appending, and ios::in
is used to open the file for reading input.
If you just want to read the file, you can probably just use:
infile.open ("input.txt", ios::in);
The default open mode for an ifstream is ios::in, so you can get rid of that altogether now. The following code is working for me using 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;
}
Solution 2
Sometimes Visual Studio puts your exe file away from your source code. By default VS may only look for the file starting from your exe file. This process is a simple step for getting the input txt file from the same directory as your source code. Should you not want to fix your IDE setup.
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);
Hopefully this helps other people for a quick solution. It took me a while to find this setup myself.
Solution 3
I've found two problems in your code:
a) syntax error in "ios::ate || ios::in" => should be "ios::ate | ios::in"
b) "ios::ate" sets the cursor to the end of file - so you get nothing when you start reading
So just remove "ios::ate" and you are fine :)
ciao, Chris
Dave Swersky
I have been writing software on the .NET platform since about 2001. Since that time I've worked on lots of systems including web portals, asset management, ERP, CRM, content management, email, and SOA. I credit my love of research and the bleeding edge with four years at Microsoft Product Support, where I learned how to learn about technology. Today I work at the Risk Management Agency of the US Department of Agriculture, where we do amazing work with Agile and DevOps (yes, for the government!) I'm also writing a book about DevOps tools: DevOps Katas: Hands-On DevOps
Updated on July 20, 2022Comments
-
Dave Swersky almost 2 years
I've been all over the ifstream questions here on SO and I'm still having trouble reading a simple text file. I'm working with Visual Studio 2008.
Here's my code:
// 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; }
I have confirmed that the input.txt file is in the correct "working directory" by checking the value of
argv[0]
. The Open method just won't work.I'm also having trouble debugging- should I not be able to set a watch on
infile.good()
orinfile.is_open()
? I keep gettingError: member function not present.
EDIT: Updated code listing with full code from .CPP file.
UPDATE: The file was NOT in the Current Working Directory. This is the directory where the project file is located. Moved it there and it works when debugging in VS.NET.
-
T.E.D. about 15 yearsHeh. Sometimes I wish my Rep was high enough to accept an answer for someone else. :-)
-
Dave Swersky about 15 yearsStill no luck :( I noticed that I had the "infile" as an "fstream" instead of "ifstream". I removed the ios:ate. The open method still isn't working.
-
Dave Swersky about 15 yearsI have the #include <fstream> in my cpp file.
-
dirkgently about 15 yearsYou need to show us the complete file in order to fix your second problem. BTW, were you able to read in the file?
-
dirkgently about 15 yearsChange ifstream::in to ios::in. Why do you need conio.h or _getch? These are non-standard. Do you have VS2008 SP1 installed?
-
Dave Swersky about 15 yearsI added conio.h and _getch just to be able to break execution and wait for a keystroke before the program terminates. Do you think this would cause a problem? I'll try removing them.
-
dirkgently about 15 yearsAre you able to compile your code cleanly? Or, are you still stuck with compilation? Check if you have SP1 installed or not and remove everything but the bare minimum and try to compile. Update your post if it doesn't.
-
Dave Swersky about 15 yearsBizarre! It doesn't work when I debug, but it works perfectly when I run the debug .exe from a command line! Any ideas why?
-
Dave Swersky about 15 yearsMore interesting: When I open the "Visual Studio 2008 Command Prompt" and run from there, I get the error. It works when I use the Windows command prompt...
-
Dave Swersky about 15 yearsGOT IT: I had to use the _getcwd() function to get the Current Working Directory, which was the project file directory, NOT the solution or Debug directory. Strangely, no amount of hard-coding the path would work when debugging. Thanks for your help!
-
Bill the Lizard about 15 yearsYou're welcome for what little help I was able to give. Looks like you worked through most of it on your own. :)
-
rsp1984 over 10 yearsDave, your comments just saved me hours of work. Can't thank you enough!
-
hariudkmr almost 4 yearshi, just to add For linux based machine the path should be path = path.substr(0,1+path.find_last_of('/')); //removes file name