プロジェクトでは、ファイルを読み取る必要があり、ファイル内の文字数を処理する必要があります。文字ごとに読み取らずに文字数を取得する方法はあります(そうでない場合は、ファイルを読み取る必要があります)。 2回、1回はその中の文字数を見つけるためだけです)。
それも可能ですか?
はい。
最後までシークして、サイズである端の位置を取得します。
FILE* file = fopen("Plop");
fseek(file, 0, SEEK_END);
size_t size = ftell(file); // This is the size of the file.
// But note it is in bytes.
// Also note if you are reading it into memory this is
// is the value you want unless you plan to dynamically
// convert the character encoding as you read.
fseek(file, 0, SEEK_SET); // Move the position back to the start.
C ++では、ストリームには同じ機能があります。
std::ifstream file("Plop");
file.seekg(0, std::ios_base::end);
size_t size = file.tellg();
file.seekg(0, std::ios_base::beg);
あなたはこれを試すことができます:
FILE *fp = ... /*open as usual*/;
fseek(fp, 0L, SEEK_END);
size_t fileSize = ftell(fp);
ただし、これは文字数ではなく、ファイル内のバイト数を返します。エンコーディングが1文字あたり1バイト(ASCIIなど)であることがわかっていない限り、同じではありません。
サイズを学習した後、ファイルを最初に「巻き戻す」必要があります。
fseek(fp, 0L, SEEK_SET);
簡単な答えはノーです。より正確には、それはシステムに依存します:Unixの下では、それは可能です(例えばを使用してstat
); Windowsでは、テキストファイルは使用できませんが、ファイルをバイナリで読み取っている場合は、GetFileSize
使用できる関数があります。
保証はされていませんが、私が知っているすべての実装(これら2つのプラットフォームの場合)では、ファイルの最後までシークしてから、を実行する
ftell
と、十分に大きな整数型に変換すると、次のような結果が得られます。上記(同じ制限付き)。
最後に、なぜこの情報が必要なのですか?テキストファイルを使用している場合でも、適切なサイズのバッファを割り当てるだけの場合はGetFileSize
(
tell
最後までシークした後)、読み取ることができるバイト数よりもわずかに大きい値が返されます。バッファは少し大きめになりますが、これは一般的に問題ではありません。
あなたはおそらくダイナミックメモリソリューションを探していると思います。あなたが実際に尋ねたのは、「ファイルを読まずにファイル内の文字数を取得する方法はありますか?」です。答えは(1文字あたり1バイトと仮定して)「はい」です。このstat
呼び出しを使用してファイルサイズを取得できます。ファイルサイズ(バイト単位)は文字数です。UTF-8の場合、答えはノーですが、学習したばかりのコンピューター科学者は通常、国際化について心配しないので、とりあえずそれを脇に置いておきましょう。
文字数を知りたいのは、すべてを収納できる大きさの収納ができるからだと思います。すべてを保存するためにファイルの大きさを知る必要はありません。
を持っている場合std::vector<char>
、最初は10文字を保持できるようになり、次に20文字、次に1万文字を保持できるようになります。ファイルを読み終えると、ファイルの数がわからなくても、すべてを保持できます。あるだろう。
頭のてっぺんからファイルサイズを見て、それを1文字のバイト数で割ってみてください。
空白やエンドラインなどを扱うときに問題が発生します。