想要在读取文件时使用atoi()类型char吗?

时间:2012-12-18 21:30:52

标签: c++

我已将映射到内存中的文件的内容提取到一个类似于:

的数组中
char* const arr = static_cast<char *>(file.get_address());

在迭代数组时我希望能够调用:

for(int i=0; i<file.get_size(); i++){
    atoi(arr[i]);
}

但是,atoi需要类型const char *,而arr [i]是char * const类型。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

首先,我质疑您在...中使用const

char* const arr = static_cast<char *>(file.get_address());

在这种情况下,const适用于指针,而不适用于指向的内容。所以,通过你的arr指针,你可以做到这一点......

arr[0] = 'a';

......我认为这不是你想要保护的。相反,我认为你真正想要的是:

const char* arr = static_cast<const char *>(file.get_address());

...它解决了您的问题所发布的内容。通过这种方式,您有一个指向无法更改的字符的指针(至少不能直接通过该指针)。

然后,在你的循环中,你在整个文件的每个字符上调用atoi(),我怀疑你真正想要做什么。您是否期待一大堆单位十进制(基数为10)的数字,没有分隔符?这是循环你的方式的唯一用例。为了争论,我们假设这就是你真正想要的。好的,那么,您希望结果在哪里?你没有将atoi()的返回值赋给任何东西。您将单位数(可能是ASCII)数字从文本转换为数字形式,但丢弃了结果。

但我认为这可能不是你真正想要的。

让我们重写你的代码,以便它将文件的第一个文本值(假设它没有前面的垃圾)转换为整数,然后打印它。在您的示例中,我们假设文件已经读入名为file的某个对象,并且我们可以通过调用file.get_address()来获取其数据缓冲区。这就是你想要的:

const char* arr = static_cast<const char *>(file.get_address());

int firstNumericValue = atoi(arr);

std::cout << "firstNumericValue = " << firstNumericValue << "\n";

......就是这样,不需要循环!如果您想从文件中读取多个值,当然可以使用循环,但是您需要查看更高级的函数,例如sscanf()strtol()。如果你使用strtol(),它的第二个参数让你得到一个指向下一个地方的指针,开始转换任何后续调用。但是这些例子比比皆是,你可以自己研究一下。

答案 1 :(得分:2)

atoi(&(arr[i]));

会做到这一点。

&运算符为您提供指向char的指针,额外的括号确保您获得指向i元素的指针。

atoi并不关心数组声明中的const,所以它在这里并不相关。