We're a community of 1077K IT Pros here for help, advice, solutions, professional growth and fun. Join us!
1,076,530 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Start New Discussion Reply to this Discussion

question about fstream

i read c++ ebook, then i make a code to open a file using fstream and use ios::in flag
here's the code :

#include <iostream>
#include <fstream>

using namespace std;

bool openFileIn(fstream&, string);
int main()
{
    fstream dataFile;
        if(openFileIn(dataFile, "sendy.txt"))
        {
            cout<<"succes";
        }
        else
        cout<<"fail";

        return 0;
}

bool openFileIn(fstream &file, string name)
{
    bool status;
    file.open(name, ios::in);

    if (file.fail())
    status = false;

    else
    status = true;

    return status;
}

the code has problem with

file.open(name, ios::in);

then i read again, the problem can be solved by converting name(string object) to cstring :

file.open(name.c_str(), ios::in);

but there's no further explanation why i must convert the it to cstring, anyone knows?
and 1 more question, why do i should use reference variable to pass a fstream object?

edited :

i just tried the code using visual c++, and there's no problem with the string "name", is the problem because of the compiler?

3
Contributors
5
Replies
11 Hours
Discussion Span
11 Months Ago
Last Updated
7
Views
Question
Answered
Sendy Hipo
Junior Poster in Training
59 posts since Apr 2012
Reputation Points: -3
Solved Threads: 0
Skill Endorsements: 0

but there's no further explanation why i must convert the it to cstring, anyone knows?

Yeah, I know. The reason is because of the original design of the libraries, in particular the iostream and the string library. Basically, they were developed more or less in isolation, and iostream came first. You will notice that the iostream library does not make use of C++ strings anywhere. The operations that you can do between iostreams and C++ strings are limited to functions that are defined by the string library (like std::getline() or the operator << and >> for strings). In other words, none of the iostream libraries include the string header. It was simply designed like that. And, obviously, if that is the case, the file-streams cannot take a C++ string as the file-name, and thus the conversion to a C-string.

why do i should use reference variable to pass a fstream object?

Such that the function parameter becomes an alias for the fstream object that was passed to the function. In other words, if you want the changes made to the fstream object within the function to affect the dataFile object in the main() function, then it must be passed by reference. Otherwise, if you don't pass-by-reference, the fstream object will be copied into the function, and when the function returns, the file will be closed as that local variable gets destroyed, and as for the dataFile object, it will remain completely unaffected (still empty).

i just tried the code using visual c++, and there's no problem with the string "name", is the problem because of the compiler?

Again, string literals like "name" are C-strings in C++. So, it should work as a file-name for a file-stream object.

mike_2000_17
21st Century Viking
Moderator
3,144 posts since Jul 2010
Reputation Points: 2,062
Solved Threads: 626
Skill Endorsements: 41

errr sry i have bad english and still newbie in programming, so the conclusion is because the fstream and string is in a different libraries, but cstring can be used by all libraries?
erm i meant i tried the code using visual c++, and there's no problem with the string object named name, is the problem because of the compiler?

 file.open(name, ios::in);

in code blocks, it has problem, but in visual c++ it works.

Sendy Hipo
Junior Poster in Training
59 posts since Apr 2012
Reputation Points: -3
Solved Threads: 0
Skill Endorsements: 0

is the problem because of the compiler?

No. You have C++ Strings and you have C-strings. Both are different and not interchangable.

Some functions have been designed to use C++ strings; some use C-strings. The documentation of each function tells you which one you need to use.

Some compilers will make extensions (added abilities) that the standard C++ definition does not describe. If both C-strings and C++Strings work in VC++ they made an extension so it will work for their compiler but not others.

WaltP
Posting Sage w/ dash of thyme
Team Colleague
11,404 posts since May 2006
Reputation Points: 3,421
Solved Threads: 1,055
Skill Endorsements: 37

but cstring can be used by all libraries?

C-strings are a built-in type. In other words, they are part of the programming language. C++ string is a library feature, defined in the header <string>. Built-in types can be used everywhere, without the need to include a library for them.

mike_2000_17
21st Century Viking
Moderator
3,144 posts since Jul 2010
Reputation Points: 2,062
Solved Threads: 626
Skill Endorsements: 41

oh okay thx i finally got it! :D

Sendy Hipo
Junior Poster in Training
59 posts since Apr 2012
Reputation Points: -3
Solved Threads: 0
Skill Endorsements: 0
Question Answered as of 11 Months Ago by mike_2000_17 and WaltP

This question has already been solved: Start a new discussion instead

Post: Markdown Syntax: Formatting Help
 
You
 
© 2013 DaniWeb® LLC
Page rendered in 0.1190 seconds using 2.67MB