tags:

views:

1391

answers:

5

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()" or "infile.is_open()"? I keep getting "Error: 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.

+7  A: 

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;
}
Bill the Lizard
Heh. Sometimes I wish my Rep was high enough to accept an answer for someone else. :-)
T.E.D.
Still 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
Bizarre! 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
More 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
GOT 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!
Dave Swersky
You're welcome for what little help I was able to give. Looks like you worked through most of it on your own. :)
Bill the Lizard
A: 
infile.open ("input.txt", ios::ate || ios::in);

|| is the logical or operator, not the bitwise operator (as Bill The Lizzard said).

so i guess you are doing the equivalent to:

infile.open ("input.txt", true);

(assuming neither ios::ate or ios::in are 0)

Tom
A: 

Try using:

ifstream fStm("input.txt", ios::ate | ios::in);

I'm also having trouble debugging- should I not be able to set a watch on "infile.good()" or "infile.is_open()"? I keep getting "Error: member function not present."

and the proper includes:

#include <fstream>

etc.

dirkgently
I have the #include <fstream> in my cpp file.
Dave Swersky
You need to show us the complete file in order to fix your second problem. BTW, were you able to read in the file?
dirkgently
Updated with full code.
Dave Swersky
Change ifstream::in to ios::in. Why do you need conio.h or _getch? These are non-standard. Do you have VS2008 SP1 installed?
dirkgently
I 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.
Dave Swersky
Are 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.
dirkgently
+1  A: 

Hi,

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

3DH
A: 

see this:

http://www.daniweb.com/forums/thread122111.html

sama