ifstream failing to open - c++

I am using Visual Studio 2013
So I have to open a .ppm image file and do some work on it, but the ifstream I'm trying to use to read the data fails to open the image file. I am pretty sure the image file is in the working directory (I have created and read some simple .txt files to make sure). And even after excessive research I can't figure out what is going on.
Here's the relevant code
EDIT: I added some more code to get an idea of what I'm trying to do
Image * PPMImageReader::read(std::string filename){
std::string line;
int width, height, max_val;
std::ifstream src(filename, std::ios_base::binary);
if (src.fail()) { //failbit is always set but not badbit
perror("Logical error on i/o operation. failbit was set\n");
if (src.bad())
perror("Read/writing error on i/o operation. badbit was set");
}
if (!src.is_open()) { //and of course this return true
printf("File was not opened\n");
exit(1);
}
//Edited
getline(src, line, '\n');
if (line.empty())
getline(src, line);
if (line.find("P6") == std::string::npos) {
printf("wrong format\n");
exit(1);
}

As from discussed came to know the problem is relative path.
fstream support relative paths as below..
Consider the following case where your input file is one level up than exe file.
E:\MyProgramBin\YourExe.exe
E:\YourInputFile.ppm
In this case, you can create your filename as below.
filename1 = "..\YourInputFile.ppm"
and use that filename1 in ifstream
std::ifstream src(filename1, std::ios_base::binary);

Related

Why SFML isn't able to load an image. SFML, C++ [duplicate]

ifstream myfile;
myfile.open("FileTest");
string line;
if(myfile.is_open())
{
cout<<"Reading from file...";
getline(myfile,line);
}
if(myfile.fail())
{
cout<<"Unable to open file"<<endl;
}
myfile.close();
C++ tries to open the file in the current directory with the exact name FileTest. Check to see if the file is in the current directory? Maybe you spelled the name incorrectly? Maybe you forgot to write FileTest.txt? You are using ifstream, which will fail if the file you're trying to open does not exist or is corrupted.

Why ifstream getline is crashing

I wrote what I thought a quite basic function to read a file. But for a reason I dont know, the std::getline crashes my application, with this output :
The program '[14092] ASREngineApp.exe' has exited with code -1073740777 (0xc0000417)
My code
std::vector<std::string> readFile(const std::string& fileName)
{
//Read file
std::vector<std::string> fileLines;
std::ifstream file;
file.open("toto.txt", std::ios::in);
if (!file)
{
//problem file NULL
//return error
}
else if (!file.is_open())
{
//file not open
//return error
}
else
{
//file opened
std::string str;
while (std::getline(file, str)) //this line crashes
{
fileLines.push_back(str);
}
}
return fileLines;
}
I triple checked and yes, toto.txt if a file that exists beside my application.
I read this answer C++: ifstream::getline problem. This following snippet is also crasing: std::copy(std::istreambuf_iterator<char>(file),std::istreambuf_iterator<char>(),std::ostream_iterator<int>(std::cout, " "));
I tried ofstream and I am able to create a file in the same folder where I am trying to open and read toto.txt
I also double checked the permission of toto.txt, everything looks good.
Compiling with vs2017
Function like file.eof and file.is_open are not crashing, but function like file.tellg and file.seekg are crashing.
EDIT, more information, problem is the ifstream constructor
It looks like the problem is coming from std::ifstream constructor.
See this debug output from my little working application with only the readfile function called from a main:
Then, the following is the debug output from the same function, in my real big application:
So, why in this case, _Mychar is equal to -52'Ì'. This value should be '\0'

How to read text from file itno standard string cpp

I am trying to read about 2 lines from a file of text into a std::string in c plus plus. I have looked through several answers and found none that work on my device. Can anyone tell me what I am doing wrong? The method is currently returning a null string, and doesn't correctly open the file or read it at all.
std::string readFile(std::string filename) {
std::ifstream infile;
infile.open(filename);
std::string output;
if (infile.is_open()) {
while(infile.good()) {
infile >> output;
}
}
infile.close();
return output;
}
Not sure what file you are trying to open but that's a completely separate problem. The code you've written will open a file if you give it a path to a file that it can open. Check your current working directory and confirm the path is correct.
Even after you solve that problem, you're going to have more problems though.
I expect that you are confused because you are repeatedly overwriting output with this line:
infile >> output;
perhaps you meant to declare output as a std::stringstream
And for me it doesn't return an empty string, it returns the last word of the file. I guess it depends what's in your file.

C++ ifstream throws file not found even though the file exists

I am trying to open a file where the file path is taken as a user input.
However, the C++ runtime says that the file does not exist, but when I hardcode the string, I am able to open the file.
std::shared_ptr<Task> Daemon::create_new_task(string &location){
std::ifstream file;
std::cout<<"Create new task->"<<location<<endl;
file.open(location.c_str(), std::ios::in);
if (!file.is_open())
perror("Error");
boost::filesystem::path f("<filepath>");
std::cerr<<boost::filesystem::exists(f);
std::stringstream buf;
buf << file.rdbuf();
return std::make_shared<Task>(location,buf.str());
}
perror() says file not found, while the second output is 1.
I tried absolute and relative paths. None of them work.
Any thoughts on this?

How do you open a file in C++?

I want to open a file for reading, the C++ way. I need to be able to do it for:
text files, which would involve some sort of read line function.
binary files, which would provide a way to read raw data into a char* buffer.
You need to use an ifstream if you just want to read (use an ofstream to write, or an fstream for both).
To open a file in text mode, do the following:
ifstream in("filename.ext", ios_base::in); // the in flag is optional
To open a file in binary mode, you just need to add the "binary" flag.
ifstream in2("filename2.ext", ios_base::in | ios_base::binary );
Use the ifstream.read() function to read a block of characters (in binary or text mode). Use the getline() function (it's global) to read an entire line.
There are three ways to do this, depending on your needs. You could use the old-school C way and call fopen/fread/fclose, or you could use the C++ fstream facilities (ifstream/ofstream), or if you're using MFC, use the CFile class, which provides functions to accomplish actual file operations.
All of these are suitable for both text and binary, though none have a specific readline functionality. What you'd most likely do instead in that case is use the fstream classes (fstream.h) and use the stream operators (<< and >>) or the read function to read/write blocks of text:
int nsize = 10;
std::vector<char> somedata(nsize);
ifstream myfile;
myfile.open("<path to file>");
myfile.read(somedata.data(), nsize);
myfile.close();
Note that, if you're using Visual Studio 2005 or higher, traditional fstream may not be available (there's a new Microsoft implementation, which is slightly different, but accomplishes the same thing).
To open and read a text file line per line, you could use the following:
// define your file name
string file_name = "data.txt";
// attach an input stream to the wanted file
ifstream input_stream(file_name);
// check stream status
if (!input_stream) cerr << "Can't open input file!";
// file contents
vector<string> text;
// one line
string line;
// extract all the text from the input file
while (getline(input_stream, line)) {
// store each line in the vector
text.push_back(line);
}
To open and read a binary file you need to explicitly declare the reading format in your input stream to be binary, and read memory that has no explicit interpretation using stream member function read():
// define your file name
string file_name = "binary_data.bin";
// attach an input stream to the wanted file
ifstream input_stream(file_name, ios::binary);
// check stream status
if (!input_stream) cerr << "Can't open input file!";
// use function that explicitly specifies the amount of block memory read
int memory_size = 10;
// allocate 10 bytes of memory on heap
char* dynamic_buffer = new char[memory_size];
// read 10 bytes and store in dynamic_buffer
file_name.read(dynamic_buffer, memory_size);
When doing this you'll need to #include the header : <iostream>
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream file;
file.open ("codebind.txt");
file << "Please writr this text to a file.\n this text is written using C++\n";
file.close();
return 0;
}
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
ifstream in_stream; // fstream command to initiate "in_stream" as a command.
char filename[31]; // variable for "filename".
cout << "Enter file name to open :: "; // asks user for input for "filename".
cin.getline(filename, 30); // this gets the line from input for "filename".
in_stream.open(filename); // this in_stream (fstream) the "filename" to open.
if (in_stream.fail())
{
cout << "Could not open file to read.""\n"; // if the open file fails.
return;
}
//.....the rest of the text goes beneath......
}
Follow the steps,
Include Header files or name space to access File class.
Make File class object Depending on your IDE platform ( i.e,
CFile,QFile,fstream).
Now you can easily find that class methods to open/read/close/getline or else of any file.
CFile/QFile/ifstream m_file;
m_file.Open(path,Other parameter/mood to open file);
For reading file you have to make buffer or string to save data and you can pass that variable in read() method.
**#include<fstream> //to use file
#include<string> //to use getline
using namespace std;
int main(){
ifstream file;
string str;
file.open("path the file" , ios::binary | ios::in);
while(true){
getline(file , str);
if(file.fail())
break;
cout<<str;
}
}**
#include <fstream>
ifstream infile;
infile.open(**file path**);
while(!infile.eof())
{
getline(infile,data);
}
infile.close();
fstream are great but I will go a little deeper and tell you about RAII.
The problem with a classic example is that you are forced to close the file by yourself, meaning that you will have to bend your architecture to this need. RAII makes use of the automatic destructor call in C++ to close the file for you.
Update: seems that std::fstream already implements RAII so the code below is useless. I'll keep it here for posterity and as an example of RAII.
class FileOpener
{
public:
FileOpener(std::fstream& file, const char* fileName): m_file(file)
{
m_file.open(fileName);
}
~FileOpeneer()
{
file.close();
}
private:
std::fstream& m_file;
};
You can now use this class in your code like this:
int nsize = 10;
char *somedata;
ifstream myfile;
FileOpener opener(myfile, "<path to file>");
myfile.read(somedata,nsize);
// myfile is closed automatically when opener destructor is called
Learning how RAII works can save you some headaches and some major memory management bugs.