what does if (!ifstream) mean in c++? - c++

I found this code and I don't know what the !ist means.
#include <iostream>
#include <fstream>
using namespace std;
#include <string>
int main()
{
string readname;
cin >> readname;
ifstream ist{ readname };
if (!ist)
{
//insert any text here
}
}
I don't know what the (!ist) is for. I have tried to figure out what this means but i cant.

std::basic_ifstream inherits std::basic_ios<CharT,Traits>::operator bool:
Checks whether the stream has no errors.
Returns true if the stream has no errors and is ready for I/O
operations. Specifically, returns !fail().
So the code is equivalent with (all of the following):
if (!static_cast<bool>(ist))
if (!ist.operator bool())
if (!!ist.fail())
if (ist.fail())

! is the boolean "not" operator, so this tests ist to see if it is not valid -- if it failed to be able to open the specified file and read from it.

Related

passing ifstream object to function and use getline() in between

I want to open a file named 1.board by calling a function and use getline function to print it's characters to new line.But this is showing a lot of errors.
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using std::ifstream;
using std::cout;
using std::string;
using std::vector;
void ReadBoardFile(ifstream& search)
{
string line;
search.open("1.board");
while(getline("1.board",line))
{
cout<<line<<"\n";
}
}
int main() {
ifstream fin;
ReadBoardFile(fin);
}
I don't know what i'm doing wrong.I just can't find a perfect and exact answer.
Help,if you can.Thanku!!!!!
So here's your code rewritten so it works.
Two changes, first the first parameter to getline should be the stream you are reading from not the name of a file. I'm guessing that you just weren't concentrating when you wrote that.
Second change, I've moved the stream variable search so that it is local to your ReadBoardFile function. There's no reason in the code you've posted to pass that in as a parameter. You might want to pass the name of the file as a parameter, but I'll leave you to make that change.
void ReadBoardFile()
{
ifstream search("1.board");
string line;
while(getline(search,line))
{
cout<<line<<"\n";
}
}
int main() {
ReadBoardFile();
}

C++ function with 3 parameters for reading in generic binary input

I'm trying to create a function getIdFromFile in files.cpp that takes 3
parameters: (a C++ string representing a filename, an istream, and an ostream) and returns an int.
This is the starting code I have:
// files.cpp
#include "files.hpp"
#include <iostream>
#include <fstream>
using std::ofstream;
using std::ifstream;
using std::ostream;
#include <sstream>
using std::string;
using std::stringstream;
using std::istream;
using std::istringstream;
int getIdFromFile (std::string(fileName),std::istream &usersData, std::ostream theStream){
&usersData.open(fileName, std::ios::in|std::ios::binary);
}
I'm getting the error:
No member named 'open' in 'std::__1::basic_istream<char>'
Is there something I need to include or add from the standard library?
Thanks
You should consider either
int getIdFromFile (std::string fileName, std::ifstream &usersData, std::ostream &theStream)
or
int getIdFromStream (std::istream &usersData, std::ostream &theStream)
In the first case you'd expect a new or a closed file stream that you would open. You'd need to define all the parameters (e.g. mode). In principle you should foresee some error handling, for example if the file name is invalid.
In the second case, you'd open the file somewhere else and pass a stream. But you could as well pass a string stream if you'd want.

Opening a file in C++

I am trying to open a file stored on my c drive with name test.txt.I am getting a lot of errors.I am new to filing in C++.Please help me out thanks.
// writing on a text file
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
ofstream mystream;
mystream.open("C:\\test",ios::in||ios::out);
/*Check if the file is opened properly*/
return 0;
}
This
mystream.open("C:\\test",ios::in || ios::out);
should be
mystream.open("C:\\test",ios::in | ios::out);
You are using the logical OR operator (||) instead of the bitwise OR operator (|). The former returns a boolean value, while the latter returns the bitwise OR of the two values.
You probably also want to fully qualify the filename. For example:
mystream.open("C:\\test.txt", ios::in | ios::out);

Very basic C++ error

Hey guys, I'm writing the simplest thing ever, just creating an ifstream to read in a text file and I have a weird error. Here is the code (note : the '<' missing for iostream and fstream are well written in my code but I couldn't write them here)
#include "genlib.h"
#include "simpio.h"
#include "random.h"
#include "vector.h"
#include "map.h"
#include <iostream>
#include <fstream>
int main() {
ifstream in;
in.open("Hamlet.txt");
if (in.fail()) Error("Could not open file");
return 0;
}
I get the following error after the ifstream in; line : "error : expected unqualified-id before '=' token"
Any idea what's going wrong ?
Thanks
The only thing unusual past ifstream in; is the Error call. My wild guess is that it's a poorly written macro. Try this instead:
int main() {
ifstream in;
in.open("Hamlet.txt");
if (in.fail()) { Error("Could not open file"); }
return 0;
}
Note the new braces around Error.
You need to add
using namespace std;
to use arbitrary names from the library without qualification. Otherwise, the declaration must be
std::ifstream in;
There is also the option
using std::ifstream;
but I wouldn't recommend it, since you probably won't be writing out std::ifstream all that often.
My guess is that in one of your own include files ("genlib.h" and "simpio.h" seem non-Standard), that you're #defined "in"
Try opening the file directly in the constructor:
ifstream inf ( "Hamlet.txt" , ifstream::in );
use std::ifstream
(and provide compilable code; those are not all standard headers, and what is Error()?)

Strange fstream problem

I have really strange problem. In Visual C++ express, I have very simple code, just:
#include <fstream>
using namespace std;
int main()
{
fstream file;
file.open("test.txt");
file<<"Hello";
file.close();
}
This same code works OK in my one project, but when I create now project and use this same lines of code, no file test.txt is created. Please, what is wrong?ยจ
EDIT: I expect to see test.txt in VS2008/project_name/debug - just like the first functional project does.
Canonical code to write to a file:
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ofstream file;
file.open("test.txt");
if ( ! file.is_open() ) {
cerr << "open error\n";
}
if ( ! ( file << "Hello" ) ) {
cerr << "write error\n";
}
file.close();
}
Whenever you perform file I/O you must test every single operation, with the possible exception of closing a file, which it is not usually possible to recover from.
As for the file being created somewhere else - simply give it a weird name like mxyzptlk.txt and then search for it using Windows explorer.
Perhaps the executable is run in a different directory than it was before, making test.txt appear somewhere else. Try using an absolute path, such as "C:\\Users\\NoName\\Desktop\\test.txt" (The double backslashes are needed as escape characters in C strings).
fstream::open() takes two arguments: filename and mode. Since you are not providing the second, you may wish to check what the default argument in fstream is or provide ios_base::out yourself.
Furthermore, you may wish to check whether the file is open. It is possible that you do not have write permissions in the current working directory (where 'test.txt' will be written since you don't provide an absolute path). fstream provides the is_open() method as one way of checking this.
Lastly, think about indenting your code. While you only have a few lines there, code can soon become difficult to read without proper indentation. Sample code:
#include <fstream>
using namespace std;
int main()
{
fstream file;
file.open("test.txt", ios_base::out);
if (not file.is_open())
{
// Your error-handling code here
}
file << "Hello";
file.close();
}
You can use Process Monitor and filter on file access and your process to determine whether the open/write is succeeding and where on disk it's happening.
Theres two ways to fix this. Either do:
file.open("test.txt", ios::out)
#include <fstream>
using namespace std;
int main()
{
fstream file;
file.open("test.txt", ios::out);
file<<"Hello";
file.close();
}
Or you can create an ofstream instead of fstream.
#include <fstream>
using namespace std;
int main()
{
ofstream file;
file.open("test.txt");
file<<"Hello";
file.close();
}