2

What I want to do is read a file called "test.txt", and then have the contents of the file be a type const char *. How would one do this?

Q2Ftb3k
  • 668
  • 3
  • 6
  • 18
  • Are you sure you need a `const char *`? If you need something to pass into a function that takes `const char *`, then you can just pass in a `char *` if that's more convenient for you. – Steve Jessop Oct 24 '10 at 20:18
  • possible duplicate of [What is the best way to slurp a file into a std::string in c++?](http://stackoverflow.com/questions/116038/what-is-the-best-way-to-slurp-a-file-into-a-stdstring-in-c) – Konrad Rudolph Oct 24 '10 at 20:19

3 Answers3

6
#include <string>
#include <fstream>

int main()
{
   std::string line,text;
   std::ifstream in("test.txt");
   while(std::getline(in, line))
   {
       text += line + "\n";
   }
   const char* data = text.c_str();
}

Be careful not to explicitly call delete on data

Armen Tsirunyan
  • 120,726
  • 52
  • 304
  • 418
  • would `std::string text; std::getline(in, text, EOF); const char* data = text.c_str();` work faster? – Mooing Duck Jul 05 '12 at 23:11
  • I was planning to add another solution that uses sstream instead of string but I found the solution by eq-, which I strongly recommend over this one as it is much more efficient as you here allocate and free the memory with each line. – Mostafa Hassan Jul 04 '17 at 16:16
5

It's highly unlikely you really want to do that. The contents of the file (which may be either text, or binary data) are unlikely to represent a (valid) pointer to a char on your architecture, so it is not really meaningful to represent it [the content] as a const char *.

What you may instead want is to load the contents of the file in memory, and then store a pointer (of type const char*) to the beginning of the given block. </pedantry> One way of achieving that:

#include <sstream>
#include <fstream>
// ...
{
    std::ostringstream sstream;
    std::ifstream fs("test.txt");
    sstream << fs.rdbuf();
    const std::string str(sstream.str());
    const char* ptr = str.c_str();
    // ptr is the pointer we wanted - do note that it's only valid
    // while str is valid (i.e. not after str goes out of scope)
}
eq-
  • 9,628
  • 34
  • 37
  • Yeah. I mess this up every time, which is odd since I usually learn from my mistakes. (I use stringstreams rarely, and "every time" I refer to the wrong header.) Fixed. – eq- Jul 05 '12 at 23:06
1

You need to:

  1. create a function returning a const char*
  2. open an fstream on the file
  3. seek to its end
  4. determine the file length by looking at the file position (tell)
  5. seek back to the beginning
  6. create a char* to contain the file contents
  7. read the file contents into the char*
  8. return the char* pointer, with the function return adding the const
  9. the file is closed automatically by the fstream going out of scope
Will
  • 68,898
  • 35
  • 156
  • 231