我已将映射到内存中的文件的内容提取到一个数组中,如下所示:
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 类型。我该如何解决这个问题?
我已将映射到内存中的文件的内容提取到一个数组中,如下所示:
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 类型。我该如何解决这个问题?
首先,我质疑你使用const
in...
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()
or strtol()
。如果您使用 strtol(),它的第二个参数可以让您获得一个指向下一个位置的指针,以便为任何后续调用开始转换。但是这些例子比比皆是,你可以自己研究它们。
atoi(&(arr[i]));
会成功的。
运算符为您提供指向 char的&
指针,额外的括号确保您获得指向i
-th 元素的指针。
atoi 不关心数组声明中的 const,所以它在这里不相关。