Implicit file extension using fopen in C++ - c++

I'm working on a project where I'm required to take input from a file with an extension ".input". when run, the user gives the filename without the file extension as a command line argument. I then take that argument, argv[1] and open the file specified but I can't get it to work without the user typing in the entire filename
for example:
user enters> run file.input
//"run" is the executable, "file.input" is the filename
user is supposed to enter> run file
how do I get this file extension implied when using this code:
fopen(argv[1],"r");
I tried using a string, setting it to argv[1] and then appending ".input" to it but fopen won't accept that string.

Without seeing your code, I can't say for certain what went wrong, but I suspect you did something like this:
string filename = argv[1];
filename += ".input";
FILE* f = fopen(filename, "r"); // <--- Error here
The issue here is that the C++ std::string type is not a char *, which is what's expected by fopen. To fix this, you can use the .c_str() member function of the std::string type, which gives back a null-terminated C-style string:
FILE* f = fopen(filename.c_str(), "r"); // No more errors!
As I mentioned in my comment, though, I think you'd be better off just using ifstream:
string filename = argv[1];
filename += ".input";
ifstream input(filename);
There's no longer a need for .c_str(), and you don't need to worry about leaking resources. Everything's managed for you. Plus, it's type-safe!

Related

File Path Name and User Input

I am trying to have the user input the file path of a file to be read by my program. However, when I try to compile the code, it errors, with the following error: no matching function to call to 'std::basic_ifstream::open(std::string&)'. The code works correctly with no errors when I directly enter the file instead of using getline or cin. I don't know what is the problem. Any suggestions?
int main()
{
ifstream input_file;
string file_name;
cout<< "Please input file path to PostFix arithmetic expressions file\n";
getline(cin, file_name);
input_file.open(file_name);
read_and_evaluate(input_file);
}
You need to compile as C++11 in order to get an ifstream constructor or open member function that takes a std::string argument. With g++ use the -std=c++11 option.
In C++03 iostream constructors only supported C strings, which you can get via std::string::c_str().
Do note that regardless of C string or std::string, in Windows this will fail to open a file with non-ANSI characters in the path, unless you first shorten the path to DOS 8.3 path items (which are pure ASCII).

ifstream file opening issues

I am having a hell of a time trying to open files on a network drive with ifstream.
I can successfully open the file if... I explicitly declare the filename, such as ifstream f("filename.txt").
However, that is the only way I can get the file open, and I need be able to dynamically find the name of that file and open it. Right now I have a string vector of the filenames in a given folder.
I have tried the following as input arguments to the ifstream constructor, to no success.
converting the string using c_str().
declaring a char* and assigning the string.cstr() to it.
same as above, but const char*
changed the system directory to the folder where the file is, and inputted the filename itself (relative path)
I print out the filename and change to its directory each time before trying to open it, so I know for a fact the filename is 100% correct.

ofstream writing data to file: How do I pass a previously defined string as the filename

I have a program that I have written with C++, OpenCV and Qt, where I am trying to write data to a csv file. In my Qt Widget I have created a QFileDialog that allows me to choose where to save the csv file.
This path is then stored as a QString, and converted to a std::string as follows;
std::string OutputFileName = OutputFile.toUtf8().constData();
I then try to pass this std::string to my ofstream::open function as follows:
ofstream CSVFile;
CSVFile.open(OutputFileName);
And there lies the problem; it refuses to compile, giving the error
no matching function for call to 'std::basic_ofstream >::open(std::string&)'
I'm very new to programming and thus I have no idea what exactly the problem is here. I have tried looking at this, but from what I can tell that is a Windows specific solution, and I am using OSX.
Can anyone tell me how I can successfully pass the filepath stored in the QString to the CSVFile.open() term?
in C++03, ofstream::open takes const char* parameter.
If OutputFileName is std::string.
Try:
CSVFile.open(OutputFileName.c_str());
If outputFileName is Qstring
CSVFile.open(OutputFileName.toStdString().c_str());
See QString::toStdString reference

Formatting a filename for fopen

I've got a function which reads in a filename from command line and then attempts to open the file and parse it. However fopen always returns null with error codes 2, 3, or 123 depending on the filename given.
The original non working code is:
void CProfiler::ExecuteIrFile( LPCTSTR pszFile)
{
FILE *fp = fopen( pszFile, "r");
if ( !fp) return;
}
Changing to fopen( "c:\\temp\\file.txt", "r") does however work.
So I've been led to believe that its a problem with escaping in the string i'm passing to fopen
Replacing \ with \\ in the string does'nt work either though. For good measure the code I used to do that is:
CString tempStr(pszFile);
tempStr.Replace("\\", "\\\\");
FILE *fp = fopen( tempStr, "r");
Is their a method of escaping a string properly for fopen, or something else i'm missing?
Uncomplicated answers would be welcomed happily as I haven't used C++ for very much at all in the past.
Solved
I had a leading space in the string getting passed, the resolution on the screen with the debugger on was too low and thus did'nt notice the space until I tried printing the string out to a file as binary.
Thanks all for your help
You can also use / in windows filenames - it's easier since you can replace single characters without having to change the string length.
eg. "c:/temp/file.txt" instead of "c:\\temp\\file.txt"

need help to getin ifstream::open to open a file and getline from it

I am just trying to open this file and use the getline function to read from the file but I cant seem to figure out why it is not working. I have stepped through it many times and the fileOpen variable is being loaded correctly with the file im trying to open, so Im unsure on why it wont open, to use getline with it. I would just like to be able to read through the file with getline, all of this is done in a recursive function to eventually read through all the files in directories. Let me know if you need more information on what exactly im doing.
string line;
ifstream file;
string fileOpen;
bf::directory_iterator dirIter ( fullPath ); //fullPath is type bf::path, passed into the function
fileOpen = (dirIter->path().filename());
file.open(fileOpen);
getline(file, line);
The path::filename function returns the base filename. If you have a path of "foo\bar.txt", path::filename will return "bar.txt". So unless "foo\" is in the current directory, the file probably doesn't exist.
What you're more likely looking for is this:
file.open(dirIter->path().native());
Or, you can use the boost::filesystem iostream types:
#include <boost/filesystem/fstream>
bf::ifstream file;
bf::directory_iterator dirIter ( fullPath ); //fullPath is type bf::path, passed into the function
file.open(dirIter->path());