23

C++ でテキスト ファイルを 1 文字ずつ読み取る方法を誰かが教えてくれるかどうか疑問に思っていました。そうすれば、(まだテキストが残っている間に) while ループを作成して、テキスト ドキュメントの次の文字を一時変数に格納し、それを使って何かを実行し、次の文字でプロセスを繰り返すことができます。ファイルとすべてを開く方法は知っていますが、temp = textFile.getchar()機能していないようです。前もって感謝します。

4

8 に答える 8

49

次のようなものを試すことができます:

char ch;
fstream fin("file", fstream::in);
while (fin >> noskipws >> ch) {
    cout << ch; // Or whatever
}
于 2012-09-02T21:54:33.303 に答える
13

noskipws@cnicutar と @Pete Becker は、 /unsettingを使用skipwsして、入力内の空白文字をスキップせずに一度に文字を読み取る可能性をすでに指摘しています。

もう 1 つの可能性は、 を使用しistreambuf_iteratorてデータを読み取ることです。これに加えて、私は通常std::transform、読み取りと処理を行うような標準アルゴリズムを使用します。

ほんの一例として、標準入力から標準出力にコピーし、すべての大文字に 3 を追加する Caesar のような暗号を実行したいと仮定してみましょAう。ラップアラウンドするため、に変換されます。DBEXYZABC

C でそれを行う場合、通常は次のようなループを使用します。

int ch;
while (EOF != (ch = getchar())) {
    if (isupper(ch)) 
        ch = ((ch - 'A') +3) % 26 + 'A';
    putchar(ch);
}

C++ で同じことを行うには、おそらく次のようにコードを記述します。

std::transform(std::istreambuf_iterator<char>(std::cin),
               std::istreambuf_iterator<char>(),
               std::ostreambuf_iterator<char>(std::cout),
               [](int ch) { return isupper(ch) ? ((ch - 'A') + 3) % 26 + 'A' : ch;});

このようにジョブを実行すると、(この場合) ラムダ関数に渡されるパラメーターの値として連続する文字を受け取ります (ただし、必要に応じて、ラムダの代わりに明示的なファンクターを使用することもできます)。

于 2012-09-02T22:42:53.487 に答える
9

Bjarne Stroustrup の言葉を引用すると、「 >> 演算子は、フォーマットされた入力、つまり、予期される型と形式のオブジェクトを読み取ることを目的としています。これが望ましくなく、文字を文字として読み取ってから調べたい場合は、get を使用します。 () 機能。"

char c;
while (input.get(c))
{
    // do something with c
}
于 2012-09-02T22:06:12.883 に答える
5

これは、ファイルを 1 文字ずつ読み取るために使用できる C++ のスタイリッシュな関数です。

void readCharFile(string &filePath) {
    ifstream in(filePath);
    char c;

    if(in.is_open()) {
        while(in.good()) {
            in.get(c);
            // Play with the data
        }
    }

    if(!in.eof() && in.fail())
        cout << "error reading " << filePath << endl;

    in.close();
}
于 2016-12-02T10:40:39.583 に答える
5
    //Variables
    char END_OF_FILE = '#';
    char singleCharacter;

    //Get a character from the input file
    inFile.get(singleCharacter);

    //Read the file until it reaches #
    //When read pointer reads the # it will exit loop
    //This requires that you have a # sign as last character in your text file

    while (singleCharacter != END_OF_FILE)
    {
         cout << singleCharacter;
         inFile.get(singleCharacter);
    }

   //If you need to store each character, declare a variable and store it
   //in the while loop.
于 2012-12-08T06:23:23.847 に答える
2

Re: textFile.getch()、あなたはそれを作ったのですか、それともうまくいくはずだと言っている参照がありますか? 後者なら手放しましょう。前者の場合は、そうしないでください。よく参考にしてください。

char ch;
textFile.unsetf(ios_base::skipws);
textFile >> ch;
于 2012-09-02T21:54:00.347 に答える
1

それが であり、導関数tempであるchar と仮定すると...textFilestd::fstream

あなたが探している構文は

textFile.get( temp );
于 2012-09-02T21:55:15.747 に答える
1

C++ で Cを使用しない理由はありません<stdio.h>。実際、C が最適な選択であることがよくあります。

#include <stdio.h>

int
main()  // (void) not necessary in C++
{
    int c;
    while ((c = getchar()) != EOF) {
        // do something with 'c' here
    }
    return 0; // technically not necessary in C++ but still good style
}
于 2012-09-02T21:56:32.260 に答える