c ++:ifstream打开传递文本文件名字符串的问题

时间:2009-11-02 17:36:18

标签: c++ string parameters text-files

我正在尝试将字符串从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>]

提前感谢您的任何意见/建议。

迪安

3 个答案:

答案 0 :(得分:48)

标准流不接受standard string,只接受c-string!所以使用c_str()传递字符串:

aStream.open(textFile.c_str());

答案 1 :(得分:3)

试试这个:

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

我认为你的代码需要将内部C字符串传递给open()调用。注意我现在不在编译器中,所以不能仔细检查这个。

您可能还想检查此方法的签名:

vector<Data*> DataReader(string textFile);

这里,当从方法返回时,将获取向量的完整副本,这可能是计算上昂贵的。注意,它不会复制Data对象,只是指针,但是有很多数据可能不是一个好主意。与字符串输入类似。

请考虑一下:

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

答案 2 :(得分:2)

ifstream openconst char*指针作为参数,使用c_str() std::string函数来获取此指针。您可以看到参数here

的含义