Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing a string to file.open();

I am used to higher level languages (java, python etc.), where this is dead obvious. I am trying to pass a string the user inputs to cin, the name of a file to open. There appears to be some sort of pointer madness error, and my code will not compile. I deleted some of my code to make it more clear.

   #include <iostream>
   #include <fstream>
   using namespace std;

   string hash(string filename);

   int main(){
           cout << "Please input a file name to hash\n";
           string filename;
           cin >> filename;
           cout <<hash(filename);
           return 0;
   }


    string hash(string filename){
            file.open(filename);
            if(file.is_open()){

                   file.close();
            }

            return returnval;
    } 

Here is the compile time error.

<code>
$ g++ md5.cpp
md5.cpp: In function ‘std::string hash(std::string)’:
md5.cpp:22: error: no matching function for call to ‘std::basic_ifstream<char, std::char_traits<char> >::open(std::string&)’
/usr/include/c++/4.2.1/fstream:518: note: candidates are: void std::basic_ifstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]
</code>

(I know that there are libraries for md5 hashes, but I am trying to learn about how the hash works, and eventually hash collision)

like image 217
Muricula Avatar asked Jun 10 '12 04:06

Muricula


People also ask

What does C_str () do in C++?

The basic_string::c_str() is a builtin function in C++ which returns a pointer to an array that contains a null-terminated sequence of characters representing the current value of the basic_string object.

How do I convert a string to an int in C++?

One effective way to convert a string object into a numeral int is to use the stoi() function. This method is commonly used for newer versions of C++, with is being introduced with C++11. It takes as input a string value and returns as output the integer version of it.

How read a string from a file in C++?

Call open() method to open a file “tpoint. txt” to perform read operation using object newfile. If file is open then Declare a string “tp”. Read all data of file object newfile using getline() method and put it into the string tp.

How do I open a file in C++?

If you only need to read from the file, open it using the ifstream object. The three objects, that is, fstream, ofstream, and ifstream, have the open() function defined in them. The function takes this syntax: open (file_name, mode);


1 Answers

open() takes a C-style string. Use std::string::c_str() to get this:

file.open (filename.c_str());

In order to use just a string, as pointed out below, you'll need to use a compiler with C++11 support, as the overload was added for C++11.

The reason it's not like Java etc. is that it came from C. Classes didn't exist in C (well, not nearly as well as they do in C++), let alone a String class. In order for C++ to provide a string class and keep compatibility, they need to be different things, and the class provides a conversion constructor for const char * -> std::string, as well as c_str() to go the other way.

Consider passing the argument (and maybe the return too) as const std::string & as well; no unnecessary copies. The optimization would probably catch those, but it's always good to do.

like image 124
chris Avatar answered Oct 12 '22 20:10

chris