web-dev-qa-db-ja.com

C ++:テキストファイル名の文字列を渡すとifstreamオープン問題

文字列をメインから別の関数に渡そうとしています。この文字列は、編集する必要があるテキストファイルの名前です。私が見る限りでは、文字列は大丈夫ですが、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>]

事前に入力/提案をお願いします。

ディーン

13
user200632

標準ストリームは_standard string_を受け付けず、_c-string_のみを受け付けます!したがって、 c_str() を使用して文字列を渡します。

_aStream.open(textFile.c_str());
_
49
AraK

これを試して:

aStream.open(textFile.c_str()); //line 11

私はあなたのコードがopen()呼び出しに渡すために内部C文字列を取る必要があると思います。現在私はコンパイラーにいないので、これを再確認することはできません。

このメソッドのシグネチャを確認することもできます。

vector<Data*> DataReader(string textFile);

ここでは、メソッドから返されたときにベクターの完全なコピーが取得されるため、計算コストが高くなる可能性があります。データオブジェクトをコピーするのではなく、ポインタのみをコピーすることに注意してください。ただし、大量のデータを使用することはお勧めできません。文字列入力でも同様です。

代わりにこれを考慮してください:

void DataReader( const string& textFile, vector<Data*>& dataOut );
4
pxb

ifstreamopenはパラメーターとして_const char*_ポインターを受け取ります。このポインターを取得するには、_std::string_のc_str()関数を使用します。パラメータの意味がわかります here

2
Ponting