Ответ 1
стандартные потоки не принимают standard string
, только c-string
! Итак, передайте строку, используя c_str()
:
aStream.open(textFile.c_str());
Я пытаюсь передать строку из main в другую функцию. эта строка - это имя текстового файла, который должен быть очищен. насколько я могу видеть, я передаю строку в порядке, но когда я пытаюсь использовать ifstream.open(textFileName)
, это не совсем работает. но когда я вручную жестко кодирую его как ifstream.open("foo.txt")
, он работает отлично. мне нужно будет использовать эту функцию несколько раз, поэтому я хотел бы иметь возможность передать строку с именем текстового файла..
здесь моя главная
#ifndef DATA_H
#define DATA_H
#include "Data.h"
#endif
#ifndef DATAREADER_H
#define DATAREADER_H
#include "DataReader.h"
#endif
using namespace std;
int main()
{
vector<Data*> database = DataReader("foo.txt");
return 0;
}
Заголовок DataReader
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#ifndef DATA_H
#define DATA_H
#include "Data.h"
#endif
using namespace std;
vector<Data*> DataReader(string textFile);
и, наконец, DataReader.cpp
#include "DataReader.h"
using namespace std;
vector<Data*> DataReader(string textFile)
{
ifstream aStream;
aStream.open(textFile); //line 11
я просмотрел ifstream.open(), и он принимает строку и режим в качестве параметров. не совсем уверен, что делать с режимами, но я попробовал их, но они дали то же сообщение об ошибке
DataReader.cpp: In function 'std::vector<Data*, std::allocator<Data*> > DataReader(std::string)':
DataReader.cpp:11: error: no matching function for call to 'std::basic_ifstream<char, std::char_traits<char> >::open(std::string&)'
/usr/local/lib/gcc/sparc-sun-solaris2.9/4.0.3/../../../../include/c++/4.0.3/fstream:495: note: candidates are: void std::basic_ifstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]
Заранее благодарю вас за любые предложения и предложения.
Дин
стандартные потоки не принимают standard string
, только c-string
! Итак, передайте строку, используя c_str()
:
aStream.open(textFile.c_str());
Попробуйте следующее:
aStream.open(textFile.c_str()); //line 11
Я думаю, что ваш код должен взять внутреннюю строку C, чтобы перейти к вызову open(). Примечание. Я не сейчас в компиляторе, поэтому не могу дважды проверить это.
Вы также можете проверить подпись этого метода:
vector<Data*> DataReader(string textFile);
Здесь полная копия вектора будет взята, когда он вернется из метода, который может быть дорогостоящим по вычислительной схеме. Обратите внимание: он не будет копировать объекты Data, просто указатели, но с большим количеством данных может быть не очень хорошая идея. Аналогично со строковым вводом.
Рассмотрим это вместо:
void DataReader( const string& textFile, vector<Data*>& dataOut );
ifstream
open
принимает указатель const char*
в качестве параметра, используйте c_str()
функцию std::string
, чтобы получить этот указатель. Вы можете увидеть значение параметров здесь