まず第一に、私はあなたの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() を呼び出していますが、これは本当にやりたいことではないでしょうか。区切り記号のない 1 桁の 10 進数 (基数 10) が大量にあることを期待していますか? それがあなたのやり方でループする唯一のユースケースです。議論のために、それがあなたが本当に望んでいるものだとしましょう。では、結果をどこに表示しますか? atoi() の戻り値を何にも割り当てていません。1桁の(おそらく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() を使用する場合、その 2 番目の引数により、後続の呼び出しのために変換を開始する次の場所へのポインターを取得できます。しかし、これらの例はたくさんあり、自分で調べることができます。