我的uni提供了一个应该在文件中读取的功能。在参数中,有fileName参数。我不明白的是为什么他们使用字符指针而不是简单的字符串?
还有,那我怎么用字符串文件名来调用这个函数呢?
我正在Visual Studio 2017社区版上运行C ++ 14。
double* read_text(char *fileName, int sizeR, int sizeC)
{
double* data = new double[sizeR*sizeC];
int i = 0;
ifstream myfile(fileName);
if (myfile.is_open())
{
while (myfile.good())
{
if (i > sizeR*sizeC - 1) break;
myfile >> *(data + i);
i++;
}
myfile.close();
}
else cout << "Unable to open file";
//cout << i;
return data;
}
编辑:我明白了,这很愚蠢。然后,我将发布一个单独的问题。感谢您的快速回复!
答案 0 :(得分:4)
为什么此文件名参数是char指针而不是字符串?
因为API的设计者选择这样做。 Stack Overflow的大多数人都不是该API的作者,因此我们无法准确回答此问题。
但是,我们可以回答另一个类似的问题:使用字符指针作为字符串参数的原因是什么?让我回答这个问题:
std::string
作为参数将允许API用户不创建std::string
对象。在以下情况下,这可能会很有用:
std::string
的“独立式”实现中。这可能不适用于您的特定示例,因为该函数的实现使用标准库,但出于完整性考虑,我加入了此参数。std::string
不提供动态内存分配的系统上使用。const
)char*
使得可以使用C语言的API。这可能是相关的,因为:
还有,那我怎么用字符串文件名来调用这个函数呢?
您可以使用c_str
成员函数获得指向以空终止的字符串的指针。不幸的是,API设计不良,参数是非常量,而c_str
返回的指针是const。您可以const_cast参数的常数,以调用此函数。这是“确定”,因为该函数实际上并未修改指向的字符串。
如果您可以要求C ++ 17标准并且源字符串为非常量,则data
成员函数将更加简单,因为它不需要const_cast。在C ++ 17之前,没有非const重载,因此它需要相同的const强制转换,并且在C ++ 11之前,不能保证指向的字符串以null结尾。
明确说明:此函数使用非常量字符串参数是错误的设计-无论该参数是指向以null结尾的字符串的字符指针,还是指向std::string
的引用。
P.S。还有其他更严重的问题:
sizeR*sizeC
,则无法避免UB。