6

256 文字のテキスト ファイルを作成しました。テキスト ファイルの最初の文字は ASCII 値 0 で、テキスト値の最後の文字は ASCII 値 255 です。その間の文字は 0 から 255 まで均等に増加します。したがって、文字 #27 は ASCII 値 27 です。文字 #148 は ASCII 値 148 である必要があります。

私の目標は、このテキスト ファイルのすべての文字を読み取ることです。

で読んでみましたcin。と を試しcin.get()てみcin.read()ましたが、どちらもフォーマットされていない入力を読み取るはずです。しかし、26 番目の文字を読み取ると、どちらも失敗します。を使用したときに、 read in を読んでいると言ったとunsigned char思いますが、これは単に真実ではありません。そして、通常の signed を使用すると、を読み込んでいると言いました。ASCIIに相当する文字が何であれ、それを読み取る必要があります。おそらくそれがヒットしたと思いますか?しかし、私は以前に別の StackOverflow の投稿を読んだことがありますが、それは実際に書くことができる文字ではありません。だから私はなぜ整数または整数を表す文字値で咳をしているのかわからないcin255charcin-126cinEOFEOFcin-1255. 誰かが私が間違っていること、その理由、そして最善の解決策とは何か、そしてその理由を教えてもらえますか?

貼り付ける具体的なコードはあまりありません。私はいくつcin.get()かの異なる非動作の組み合わせを試しました. これを除いて、私は26番目の文字を超えて読むことができなかった:cin.read()charunsigned charcharint

unsigned char character;

while ( (character = (unsigned char)cin.get()) != EOF) { ... }

興味深いことに、これは while ループを 26 文字目で止めませんが、先にも進みません。気に入らないものを検出した瞬間に次のキャラクターに進むことを拒否するか、単に拒否するかのcinようcin.get()です。cin.read()また、次のようなものが存在することも認識していcin.ignore()ますが、私の入力は予測できません。つまり、このテキスト ファイルの 256 文字は単なるテスト ケースであり、実際の入力はかなりランダムです。これは大きな宿題の一部ですが、この特定の質問は宿題とは関係ありません。プロセスの一部で立ち往生しています。

注:特定のテキスト ファイルではなく、標準入力ストリームから読み込んでいます。まだ簡単な解決策はないようです。これが以前に行われたことがないとは信じられませんcin

アップデート:

Windows では、おそらく Ctrl-Z が原因で、文字 26 の後に停止します。この問題はあまり気にしません。Linux でのみ動作する必要があります。

ただし、Linux では、0 から 127 までのすべての文字を読み取ります。しかし、127 から 255 までの拡張 ASCII 文字を読み取っていないようです。模倣するはずの出力を生成する「ソリューション」プログラムがあり、それはプログラムは何とか​​ 255 文字すべてを読み取ることができます。

質問: を使用してcin、255 個の ASCII 文字をすべて読み取るにはどうすればよいですか?

解決済み

使用:

int characterInt;
unsigned char character;

while ( (characterInt = getchar()) != EOF )
{
            // 'character' now stores values from 0 - 255
    character = (unsigned char)(characterInt);
}
4

3 に答える 3

5

私はあなたが窓にいると思います。Windowsプラットフォームでは、文字26はctrl-zであり、コンソールでファイルの終わりを表すために使用されるため、iostreamsはファイルがその文字で終わると考えています。

cinが使用しているテキストモードでこれを実行します。バイナリモードでSteamを開くと、これは実行されません。

于 2013-02-21T17:50:46.847 に答える
3

std::cin任意のバイナリ データではなく、テキスト ストリームを読み取ります。

なぜ 26 番目の文字が興味深いのかというと、おそらく CP/M の派生物 (MS-DOS や MS-Windows など) を使用しているからです。これらのオペレーティング システムでは、Control-Z がテキスト ファイルの EOF 文字として使用されます。


編集: Linux では、g++ 4.4.3 を使用して、次のプログラムは正確に期待どおりに動作し、0 から 255 までの数値を出力します。

#include <iostream>
#include <iomanip>

int main () {
  int ch;
  while( (ch=std::cin.get()) != std::istream::traits_type::eof() )
    std::cout << ch << " ";
  std::cout << "\n";
}
于 2013-02-21T17:48:42.777 に答える
1

ここには 2 つの問題があります。1 つ目は、Windows の既定のモードcinはバイナリではなくテキストであるため、特定の文字がプログラムに入力される代わりに解釈されることです。特に、26 番目の文字である Ctrl-Z は、後方互換性が極端に高いため、ファイルの終わりとして解釈されています。

もう1つの問題は、cin >>動作方法によるものです-空白をスキップします。これには明らかにスペースが含まれますが、タブ、改行なども含まれます。すべての文字を読み取るには、またはcinを使用する必要があります。cin.get()cin.read()

于 2013-02-21T19:53:59.087 に答える