2009-11-02 24 views
12

için bir dize iletilmesiyle ifstream açık problemi ana kaynaktan başka bir işlevin bir dizesini geçirmeye çalışıyorum. Bu dize, sızması gereken bir metin dosyasının adıdır. Görebildiğim kadarıyla, dize tamamıyla geçiyorum, ama ben ifstream.open(textFileName) kullanmayı denediğimde, oldukça işe yaramıyor. ama elle ifstream.open("foo.txt") olarak kodladığımda, gayet iyi çalışıyor. i metin dosyası adının bir dizesinde geçmek mümkün olmak istiyorum bu yüzden C++: metin dosyası adı

burada
#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

benim ana

#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; 
} 

başlık var .. bu fonksiyonu birkaç kez kullanmanız gerekir

ve son olarak DataReader.cpp

#include "DataReader.h" 

using namespace std; 

vector<Data*> DataReader(string textFile) 
{ 
ifstream aStream;  
aStream.open(textFile); //line 11 

i ifstream.open baktı() ve bir sürer string ve parametre olarak bir mod. gerçekten emin modları ne yapacağını, ama ben onları denedik ama onlar

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>] 

herhangi bir giriş/öneriler için şimdiden teşekkür ederim aynı hata mesajı verdi. Dekan

+2

Parametrelerin anlamlarını görebilirsiniz. Eğer korumalarınızı * korumak için kullanacağınız başlıkları * koyarsanız, hayatınızda daha büyük başarılar bulacaksınız. Bir başlık dahilinde, her bir başlığın koruyucu sembolünün ismini bilmeniz gereken, koşullu olarak dahil etmek için dört satır değil, tek bir # # include satırında olması gerekir. Her başlığın ilk iki satırı '# ifndef' /' # define' olacak ve son satır '# endif' olacaktır. Gördüğünüz her * başlıktaki bu örnekleri görebilmeniz gerekir. –

cevap

42

standart akışları

bir standard string, sadece c-string kabul etmez!

aStream.open(textFile.c_str()); 
+0

çok teşekkür ederim! Sanırım argümanlara daha yakından bakmalıydım ..... – user200632

+0

Ben c_str() 'derleme hatası temelinde çalışacağını düşündüm, ancak C++ 'std :: string' içinde geçme seçeneğinin olmadığına şaşırdım. –

+0

sadece derleyicinize C++ 11 'i kullanacak bayrağa vermeniz gerekiyor ve daha sonra bir dizgeyi geçirebilirsiniz. – NDEthos

3

bu deneyin:

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

Ben senin kod open() çağrısı geçirmek için iç C dize almak gerektiğini düşünüyorum Yani c_str() kullanarak dizeyi geçmektedir. Not Şu anda bir derleyicide değilim, bu yüzden bunu kontrol edemiyorum.

Ayrıca bu yöntemin imzasını kontrol etmek isteyebilirsiniz: İşte

vector<Data*> DataReader(string textFile); 

, vektör tam bir kopyası o hesaplama pahalı olabilir yöntemle, dönen ne zaman alınacaktır. Not, Veri nesneleri, sadece işaretçiler kopyalamaz, ancak çok veri ile iyi bir fikir olmayabilir. Aynı şekilde string girişi ile.

yerine bu göz önünde bulundurun:

2

ifstreamopen, parametre olarak bir const char* işaretçi alır, bu işaretçi için std::string arasında c_str() işlevini kullanın. here

İlgili konular