我已将映射到内存中的文件的内容提取到一个类似于:
的数组中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类型。我该如何解决这个问题?
答案 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,所以它在这里并不相关。