2012-12-18 41 views
0

我已提取映射到存儲器中的文件的內容,到一個數組,它看起來像:想要在讀取文件時使用類型char上的atoi()?

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 *類型。我該如何解決這個問題?

+1

您實際遇到的問題是什麼?在C或C++中,您總是可以將非常量X傳遞給期望常量X的函數;這是被禁止的另一種方式。 –

+0

@JesusPlusPlus更好地使用[snprintf()](http://www.cplusplus.com/reference/cstdio/snprintf/)來避免緩衝區溢出。我認爲這也是錯誤的方向 - atoi()將字符串轉換爲整數。 –

+0

除了我最初爲什麼不使用'std :: strtol()'而進行的思考之外,你正在向你的atoi()調用傳遞一個** char **,這顯然是不正確的,如果你做'atoi(arr [i])'。我認爲你的意思是atoi(arr + i)'。 – WhozCraig

回答

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(),它的第二個參數可以讓你得到一個指向下一個地方的指針,以開始轉換任何後續調用。但是這些例子比比皆是,你可以自己研究它們。

+0

我很擔心sscanf()和這樣的函數包含隱藏的內存複製,我希望這樣儘可能瘦(因此循環等)。 – user997112

+3

@ user997112 - 如果您擔心開銷,一定要確保您自己的轉換功能。大多數人對這種事情的擔憂都是沒有根據我很好奇你的應用程序是什麼,你不能簡單地使用該平臺的工具來進行常見的轉換,即使你自己實現自己,我懷疑你可以得到的任何性能改進都會證明你花時間寫作並調試它。 – phonetagger

+0

@ user997112 - 無論如何,我強烈建議您先讓程序使用標準工具。如果它的性能不符合你的要求,那麼在那個時候考慮優化。在大多數情況下,高層次的算法決策會影響真實的性能,而不是像這樣的低級操作中的微小差異。但也有例外,尤其是像這樣的低級別操作正在進行大量處理的情況下。 – phonetagger

2
atoi(&(arr[i])); 

將做的伎倆。

&運算符爲您提供了一個指向char的指針,並且額外的圓括號確保您得到指向第i個元素的指針。

atoi不關心數組聲明上的const,所以它在這裏沒有關係。

+5

或者跳過&和[]完全使用'atoi(arr + i)' – WhozCraig

+1

@WhozCraig - 我既沒賭注atoi( &(arr [i]));'也不'atoi(arr + i);'將「做訣竅」,除非OP的目標是獲得文件中每個文本數值的剩餘部分,這兩個目標非常適合。 – phonetagger

+0

這對我來說並不是很好,因爲它沒有返回字符,它從文件中返回了一系列字符。我只是想按字符抓住字符 – user997112

相關問題