0

To pass an ifstream type as an argument for a function?

bool initGame(Game &game, int argc, char *argv[]){
	
	
	ifstream board(argv[1]); // <------------------- This part
	ifstream deck(argv[2]);
	int numPlayers= atoi(argv[3]);
	int numRounds= atoi(argv[4]);
	
	if (board.fail() || deck.fail()
		|| numPlayers==0 || MAXPLAYERS < numPlayers
		|| numRounds < 1 || numRounds > 1000
		|| (strcmp(argv[5], "yes") && strcmp(argv[5], "no")))
		{
		cout<< "Improper arguments." << endl;
		exit(1);}
	
	else{
	
	initBoard(board); // <------------ This part
	return true;}
	
	}

I was going to use a separate function to read the data from the file as needed, but I get compiling errors if I try this:

void initBoard(ifstream board){
	string squares;
	getline (board, squares, '\n');
	
	cout << squares;}<------------ For testing purposes, will do other stuff l8r

Any help would be appreciated, as I'm considering taking some very very drastic coding measures to get this to work if I cannot figure it out soon. And really, nobody wants that.

4
Contributors
16
Replies
17
Views
8 Years
Discussion Span
Last Post by Ellisande
0

you have to pass fstream objects by reference

void initBoard(ifstream& board){
	string squares;
	getline (board, squares, '\n');
	
	cout << squares;}<------------ For testing purposes, will do other stuff l8r
0

I'm not sure if it's due to my Linuxness, but every time I try and compile with that code I get strings of errors, such as

THIS ISN'T CODE THESE ARE REALLY ERRORS

/usr/include/c++/4.2/bits/ios_base.h: In copy constructor ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2/bits/ios_base.h:779: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
/usr/include/c++/4.2/iosfwd:55: error: within this context
/usr/include/c++/4.2/iosfwd: In copy constructor ‘std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char, std::char_traits<char> >&)’:

and

/usr/include/c++/4.2/iosfwd:89: note: synthesized method ‘std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)’ first required here 
p3.cpp: In function ‘bool initGame(Game&, int, char**)’:
p3.cpp:45: note: synthesized method ‘std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char, std::char_traits<char> >&)’ first required here 
p3.cpp:45: error:   initializing argument 1 of ‘void initBoard(std::ifstream)’
p3.cpp: In function ‘void initBoard(std::ifstream&)’:
p3.cpp:53: error: cannot convert ‘std::ifstream*’ to ‘char**’ for argument ‘1’ to ‘__ssize_t getline(char**, size_t*, FILE*)’

Also my header files

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <cassert>
#include <sstream>
#include <string>
#include "p3.h"
0

One of your errors is that the compiler thinks you're trying to call getline(char** lineptr, size_t *n, FILE *stream) (which you can read about with man getline ), instead of the iostreams getline.

Your arguments are out of order; it should be getline(squares, board, '\n') .

0

>error: cannot convert ‘std::ifstream*’ to ‘char**’ for
>argument ‘1’ to ‘__ssize_t getline(char**, size_t*, FILE*)’
That looks like your compiler is trying to call the wrong function. Try prefixing getline with std:: to force name lookup to check the std namespace.

0
void initBoard(ifstream& board){
	string squares;
	std::getline (board, squares);
	
	cout << squares;}

That is my entire function, and it's still throwing some pretty wild errors (even if I try and take out the cout and leave only the important code)

0

Did you... read my post?

Yes, even with the arguments reversed I'm still getting

cjtrombl@cjtrombl-laptop:~/Documents/programs/proj3$ g++ -Wall -Werror -m32 p3.cpp p3support.cpp -o test
/usr/include/c++/4.2/bits/ios_base.h: In copy constructor ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2/bits/ios_base.h:779: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
/usr/include/c++/4.2/iosfwd:55: error: within this context
/usr/include/c++/4.2/iosfwd: In copy constructor ‘std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2/iosfwd:89: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’ first required here 
/usr/include/c++/4.2/streambuf: In copy constructor ‘std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2/streambuf:794: error: ‘std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]’ is private
/usr/include/c++/4.2/iosfwd:86: error: within this context
/usr/include/c++/4.2/iosfwd: In copy constructor ‘std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2/iosfwd:89: note: synthesized method ‘std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)’ first required here 
p3.cpp: In function ‘bool initGame(Game&, int, char**)’:
p3.cpp:45: note: synthesized method ‘std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char, std::char_traits<char> >&)’ first required here 
p3.cpp:45: error:   initializing argument 1 of ‘void initBoard(std::ifstream)’
p3.cpp: In function ‘void initBoard(std::ifstream&)’:
p3.cpp:53: error: cannot convert ‘std::string’ to ‘char**’ for argument ‘1’ to ‘__ssize_t getline(char**, size_t*, FILE*)’
cjtrombl@cjtrombl-laptop:~/Documents/programs/proj3$ 



void initBoard(ifstream& board){
	string squares;
	getline(squares, board, '\n');}
0
initBoard(board);




void initBoard(istream& board){
	string squares;
	getline(board, squares, '\n');
	cout << squares;}

istream vs ifstream: one of them works and the other does not.

0

>>Istream vs ifstream: one of them works and the other does not.

Yes -- but do you know which one is the correct one ? (Hint: check spelling and capatilization).

0

The capitalization was an accident.

For whatever reason I can pass board as an istream but NOT as an ifstream.

0

There is something else wrong. Post complete code. If its pretty large then hit the Go Advanced button and mnake it an attachment.

0

There is something else wrong. Post complete code. If its pretty large then hit the Go Advanced button and mnake it an attachment.

Hopefully it's not too long.

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <cassert>
#include <sstream>
#include <string>
#include "p3.h"



bool initGame(Game &game, int argc, char *argv[]);
void initBoard(istream& board, Game& game);


using namespace std;

int myMain(int argc, char *argv[]){ <----- This is a required function in my coding project
	
	struct Game game;
	initGame(game, argc, argv);
	return 0;

	
	
}


bool initGame(Game &game, int argc, char *argv[]){
	
	
	ifstream board(argv[1]);
	ifstream deck(argv[2]);
	int numPlayers= atoi(argv[3]);
	int numRounds= atoi(argv[4]);
	
	if (board.fail() || deck.fail()
		|| numPlayers==0 || MAXPLAYERS < numPlayers
		|| numRounds < 1 || numRounds > 1000
		|| (strcmp(argv[5], "yes") && strcmp(argv[5], "no")))
		{
		cout<< "Improper arguments." << endl;
		exit(1);}
	
	else{
	
	
	initBoard(board, game);
	return true;}
}
	
	
void initBoard(istream& board, Game &game){
	string square;
	getline(board, square, '\n');
	game.board.numSquares= atoi(square.c_str());
	cout << game.board.numSquares << endl;}

The problem is with the highlighted text.

0

just change lines 12 and 52 to use ifstream instead of istream. And since you did not code the using namespace std; you have to use std::ifstream ... to specify the std namespace.

0

just change lines 12 and 52 to use ifstream instead of istream. And since you did not code the using namespace std; you have to use std::ifstream ... to specify the std namespace.

Line 15. I always code using namespace std;, I wouldn't know what to do without it.

0

Wow. Sometimes I just hate me. That was the only reason it was failing.

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.