文字列をメインから別の関数に渡そうとしています。この文字列は、編集する必要があるテキストファイルの名前です。私が見る限りでは、文字列は大丈夫ですが、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
私はあなたのコードがopen()呼び出しに渡すために内部C文字列を取る必要があると思います。現在私はコンパイラーにいないので、これを再確認することはできません。
このメソッドのシグネチャを確認することもできます。
vector<Data*> DataReader(string textFile);
ここでは、メソッドから返されたときにベクターの完全なコピーが取得されるため、計算コストが高くなる可能性があります。データオブジェクトをコピーするのではなく、ポインタのみをコピーすることに注意してください。ただし、大量のデータを使用することはお勧めできません。文字列入力でも同様です。
代わりにこれを考慮してください:
void DataReader( const string& textFile, vector<Data*>& dataOut );
ifstream
open
はパラメーターとして_const char*
_ポインターを受け取ります。このポインターを取得するには、_std::string
_のc_str()
関数を使用します。パラメータの意味がわかります here