No instance of constructor error in CPP - c++

I tried to create a function to identify matched line from a string. My whole string is saved in strStart and strToMatch contains the search string. Following is my code
void ExpertContextUser::removeMatchedString() {
String line;
String strStart="Testing\nReturns\nrelated\nresources";
String strToMatch="Test";
istringstream streamAddtText(strStart);
while(std::getline(streamAddtText, line)) {
cout << line << "Function" << endl;
if(line.index(strToMatch) > 0) {
TraceMessage <<" Test Success" << endl;
}
}
}
when i am compiling my code, i am getting following error
"../user_model_impl.cxx", line 234: error #2289: no instance of constructor
"std::basic_istringstream<_CharT, _Traits,
_Allocator>::basic_istringstream [with _CharT=char,
_Traits=std::char_traits, _Allocator=std::allocator]"
matches the argument list
argument types are: (RWCString)
istringstream streamAddtText(strStart);
I am unable to find reasons for this error.

The error happens because the istringstream constructor takes a std::string, not a RWCString. You need to provide a conversion from RWCString to std::string if you want this to work.

Related

Why does getline evaluate to false when i put stringstream in it

std::string str;
uint food;
fd.open("Costs.csv",std::fstream::in);
if (!(fd.is_open())){
return 0;
}
std::getline(fd, str);
std::getline(fd, str);
std::stringstream strStream(str);
std::cout << str << std::endl;
std::getline(strStream, food, ',');
So, on the last one i have these error:
**error: no matching function for call to 'getline(std::stringstream&, uint&, char)'
From https://en.cppreference.com/w/cpp/string/basic_string/getline
Parameters for getline(stream,string,char) and not
getline(stream,uint,char).
When you encounter such error means function exists but the arguments are of wrong type or/and in wrong order.

c++ Fstream string combination error

I'm trying to make a function that writes a .ps1 script. I'm learning fstream functions and methods and I ran in to some troubles. I can't figure a way to make Fstream create the file at the given path (path1) and add in the same time a given name for the file and the extension.
void write(string s, string name) {
ostringstream fille;
fille << "$client = new-object System.Net.WebClient\n" << s;
string fil = fille.str();
ostringstream pat;
pat << path1 << "/" << ".ps1";
string path = pat.str();
fstream file(path);
if (file.open()) {
file << fil;
file.close();
}
}
I get the following error message (on the if line) during compilation:
no instance of overloaded function "std::basic_fstream<_Elem, _Traits>::open [with _Elem=char, _Traits=std::char_traits<char>]" matches the argument list
C2661 'std::basic_fstream<char,std::char_traits<char>>‌​::open': no overloaded function takes 0 arguments
First of all you don't use name parameter.
Second you don't define path1 variable.
And you do not need to call fstream::open method if you use fstream's initialization constructor.
void write( const std::string & s, const std::string & name )
{
std::string fil("$client = new-object System.Net.WebClient\n");
fil += s;
std::ostringstream path;
path << "C:/Folder/" << name << ".ps1";
std::ofstream file( path.str() );
if ( file.is_open() ) {
file << fil;
file.close();
}
}
if (file.open()) {
Look at a reference: as the error message states, there isn't a member function of fstream called open that takes no arguments.
This is probably a typo for:
if (file.is_open()) {

getline using strings in C++ returning error: No instance of overloaded function getline matches the argument list

I'm trying to parse a document using getline to take an entire line and place it in the string variable named 'line.' The problem is I'm getting an error that says: "No instance of overloaded function getline matches the argument list." Can anyone help me solve this problem?
#include <iostream>
#include <fstream>
#include <string>
#include "recordsOffice.h"
using namespace std;
RecordsOffice::RecordsOffice()
{
}
void RecordsOffice::parseCommands (string commandsFileName)
{
//String to hold a line from the file
string line;
//Open the file
ifstream myFile;
myFile.open(commandsFileName);
// Check to make sure the file opened properly
if (!myFile.is_open())
{
cout << "There was an error opening " << commandsFileName << "." << endl;
return;
}
//Parse the document
while (getline(myFile, line, '/n'))
{
if (line[0] == 'A')
{
addStudent(line);
}
Your escape sequence is backward - try replacing
/n
With
\n
Multicharacter character liberals in C++ have type int, rather than type char, which is causing the arguments to std::getline to have the wrong type. (Thanks to #chris for pointing out that the type will be int specifically!)
Hope this helps!

File I/0 Function what type of arguments does it take?

Hey i'm writing a game in C++ and i don't understand what type of arguments the save function takes. I assumed you would use the file name for the arguments but i just get an error.
4 IntelliSense: a reference of type "std::ofstream &" (not const-qualified) cannot be > initialized with a value of type "const
char [9]" c:\Users\Conor\Documents\College\C++
Programming\Marooned\Marooned\MainApp.cpp 13 13 Marooned
void MenuText::print()
{
cout<< "Story= " << mText<< endl;
cout<< endl;
}
void MenuText::save(ofstream& outFile)
{
outFile<< "Story = " << mText<< endl;
outFile<< endl;
}
void MenuText::load(ifstream& inFile)
{
string garbage;
inFile>> garbage >> mText;
}
Can anyone help me understand what type of arguments does it take?
It seems that you are calling the save function with a literal string (the filename I guess by the error message). You should call it with an existing ofstream instead.
Something like
MenuText menuText;
std::ofstream output("some file name");
menuText.save(output);
std::ofstream& is a reference to an output stream. So you need to pass in an ofstream (Output File stream): http://www.cplusplus.com/reference/iostream/ofstream/

Returning ifstream in a function

Here's probably a very noobish question for you: How (if at all possible) can I return an ifstream from a function?
Basically, I need to obtain the filename of a database from the user, and if the database with that filename does not exist, then I need to create that file for the user. I know how to do that, but only by asking the user to restart the program after creating the file. I wanted to avoid that inconvenience for the user if possible, but the function below does not compile in gcc:
ifstream getFile() {
string fileName;
cout << "Please enter in the name of the file you'd like to open: ";
cin >> fileName;
ifstream first(fileName.c_str());
if(first.fail()) {
cout << "File " << fileName << " not found.\n";
first.close();
ofstream second(fileName.c_str());
cout << "File created.\n";
second.close();
ifstream third(fileName.c_str());
return third; //compiler error here
}
else
return first;
}
EDIT: sorry, forgot to tell you where and what the compiler error was:
main.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
EDIT: I changed the function to return a pointer instead as Remus suggested, and changed the line in main() to "ifstream database = *getFile()"; now I get this error again, but this time in the line in main():
main.cpp:27: 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
No, not really. ifstream doesn't have a copy constructor, and if you try to return one, that means copying the instance in your function out to wherever the return needs to go.
The usual workaround is to pass in a reference to one, and modify that reference in your function.
Edit: while that will allow your code to work, it won't fix the basic problem. Right now, you're mixing two rather different responsibilities into a single function: 1) obtain a file name, 2) open or create that file. I think if you separate those, the code will be simpler, and make it much easier to eliminate the source of the problem you're seeing.
Edit 2: Using a reference like this works perfectly well without an operator=. The general idea is something like:
int open_file(char const *name, fstream &stream) {
stream.open(name);
}
The assignment operator is neither necessary nor useful in this case -- we simply use the existing fstream via the reference. An operator= would be necessary if and only if we had to pass the argument to the ctor. With a stream, we can default construct a stream that doesn't connect to a file, and then use open to connect to the file after the fact.
bool checkFileExistence(const string& filename)
{
ifstream f(filename.c_str());
return f.is_open();
}
string getFileName()
{
string filename;
cout << "Please enter in the name of the file you'd like to open: ";
cin >> filename;
return filename;
}
void getFile(string filename, /*out*/ ifstream& file)
{
const bool file_exists = checkFileExistence(filename);
if (!file_exists) {
cout << "File " << filename << " not found." << endl;
filename = getFileName(); // poor style to reset input parameter though
ofstream dummy(filename.c_str();
if (!dummy.is_open()) {
cerr << "Could not create file." << endl;
return;
}
cout << "File created." << endl;
}
file.open(filename.c_str());
}
int main()
{
// ...
ifstream file;
getFile("filename.ext", file);
if (file.is_open()) {
// do any stuff with file
}
// ...
}
ifstream does not support copy construct semantics (that what the error message basically sais), so you cannot return an ifstream. Return an ifstream* instead, and pass to the caller the responsability to delete the allocate pointer.
As an option, ifstream may be extended and custom constructor added to new class.
I've extended it to create test resource stream, encapsulating test resource lookup inside of it.
// test_utils.h
class TestResourceStream : public std::ifstream {
public:
TestResourceStream(const char* file_path);
};
// test_utils.cpp
namespace fs = std::filesystem;
fs::path test_resource_path(const char* file_path) {
fs::path path{std::string{"tests/resources/"} + file_path};
if (!fs::exists(path))
throw std::runtime_error{std::string{"path "} +
fs::absolute(path).c_str() + " does not exist"};
return path;
}
TestResourceStream::TestResourceStream(const char* file_path)
:std::ifstream{test_resource_path(file_path).c_str()} {}
// usage in test
TEST_CASE("parse") {
std::list<GosDump::Expertise> expertises;
TestResourceStream stream("requests/page_response.json");
GosDump::Json::parse(expertises, stream);
REQUIRE(10 == expertises.size());
}