首先,我懷疑你在使用的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(),它的第二個參數可以讓你得到一個指向下一個地方的指針,以開始轉換任何後續調用。但是這些例子比比皆是,你可以自己研究它們。
您實際遇到的問題是什麼?在C或C++中,您總是可以將非常量X傳遞給期望常量X的函數;這是被禁止的另一種方式。 –
@JesusPlusPlus更好地使用[snprintf()](http://www.cplusplus.com/reference/cstdio/snprintf/)來避免緩衝區溢出。我認爲這也是錯誤的方向 - atoi()將字符串轉換爲整數。 –
除了我最初爲什麼不使用'std :: strtol()'而進行的思考之外,你正在向你的atoi()調用傳遞一個** char **,這顯然是不正確的,如果你做'atoi(arr [i])'。我認爲你的意思是atoi(arr + i)'。 – WhozCraig