2009-11-02 4 views
12

저는 main에서 다른 함수로 문자열을 전달하려고합니다. 이 문자열은 oepened해야하는 텍스트 파일의 이름입니다. 내가 볼 수있는 한, 문자열을 괜찮게 전달하고 있지만, ifstream.open(textFileName)을 사용하려고하면 제대로 작동하지 않습니다. 하지만 난 수동으로 ifstream.open("foo.txt")로 하드 코드, 잘 작동합니다. 내가 텍스트 파일 이름의 문자열에 통과 할 수 있도록하고 싶습니다 그래서 C++ : 텍스트 파일 이름에 문자열을 전달하는 ifstream 문제가 열려 있습니다.

여기
#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를

의 내 주요

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

입력/제안 사항에 대해 미리 감사드립니다. 딘

+2

포함 경비원을 경비하기위한 헤더 안쪽에 넣으면 인생에서 더 큰 성공을 거둘 수 있습니다. 헤더를 포함하는 것은'#include' 라인과 같이 간단해야하며, 조건부로 4 라인을 포함하지 않아야합니다. 여기서 각 헤더의 가드 심볼의 이름을 알아야합니다. 각 헤더의 처음 두 줄은'# ifndef' /'# define'이고 마지막 줄은'#endif'입니다. 당신은 * 모든 * 헤더에서 이것의 예를 찾을 수 있어야합니다. –

답변

42

표준 스트림

standard stringc-string를 허용하지 않습니다!

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

대단히 감사합니다 !! 나는 좀 더 자세히 논해야 할 것 같아 ..... – user200632

+0

나는'c_str()'이 컴파일 에러에 따라 작동해야한다고 생각했지만, C++에는'std :: string'을 전달할 옵션이 없다는 것에 놀랐습니다. –

+0

당신은 컴파일러에게 C++ 11을 사용하기위한 플래그를 주어야합니다. 그런 다음 문자열을 전달할 수 있습니다. – NDEthos

3

이 시도 :

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

내가 코드를 오픈() 호출에 전달하는 내부 C 문자열을 취할 필요하다고 생각 그래서 c_str()를 사용하여 문자열을 전달합니다. 지금 컴파일러가 아니기 때문에 이것을 다시 확인할 수는 없습니다.

또한이 방법의 서명을 확인 할 수 있습니다 : 여기

vector<Data*> DataReader(string textFile); 

이 벡터의 완전한 사본이 계산 비용이 될 수있는 방법에서 반환 할 때 이동합니다. 포인터는 데이터 객체를 복사하지 않지만 데이터가 많으면 좋은 생각이 아닐 수도 있습니다. 문자열 입력과 유사합니다.

이 대신 고려 :

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

ifstreamopen는 매개 변수로 const char* 포인터를 취이 포인터를 얻을 std::stringc_str() 기능을 사용합니다. 매개 변수의 의미를 볼 수 있습니다. here

관련 문제