C++のテキストファイルから文字ごとに読み取る方法を誰かが助けてくれるかどうか疑問に思っていました。そうすれば、(テキストがまだ残っている間に)whileループを使用して、テキスト文書の次の文字を一時変数に格納し、それを使って何かを実行し、次の文字でプロセスを繰り返すことができます。ファイルとすべてを開く方法は知っていますが、temp = textFile.getchar()
は機能しないようです。前もって感謝します。
次のようなものを試すことができます:
char ch;
fstream fin("file", fstream::in);
while (fin >> noskipws >> ch) {
cout << ch; // Or whatever
}
@cnicutarと@Pete Beckerは、noskipws
/unsetting skipws
を使用して、入力内の空白文字をスキップせずに一度に文字を読み取る可能性をすでに指摘しています。
別の可能性は、istreambuf_iterator
を使用してデータを読み取ることです。これに加えて、通常、std::transform
などの標準アルゴリズムを使用して読み取りと処理を行います。
たとえば、Caesarのような暗号化を行い、標準入力から標準出力にコピーしたいが、すべての大文字に3を追加すると、A
はD
になります。 B
はE
などになる可能性があります(最後にラップアラウンドするので、XYZ
はABC
に変換されます。
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;});
この方法でジョブを実行すると、(この場合)ラムダ関数に渡されるパラメーターの値として連続した文字を受け取ります(ただし、ラムダの代わりに明示的なファンクターを使用することもできます)。
Bjarne Stroustrupを引用するには: ">>演算子は、フォーマットされた入力を対象としています。つまり、予想されるタイプとフォーマットのオブジェクトを読み取ります。 () 関数。"
char c;
while (input.get(c))
{
// do something with c
}
//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.
Re:textFile.getch()
、それを構成しましたか、それとも機能するはずだというリファレンスがありますか?後者の場合は、取り除いてください。前者の場合は、そうしないでください。良いリファレンスを入手してください。
char ch;
textFile.unsetf(ios_base::skipws);
textFile >> ch;
C++でC <stdio.h>
を使用しない理由はありません。実際、多くの場合、これが最適な選択です。
#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
}
以下は、文字ごとにファイルを読み取るために使用できる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();
}
temp
がchar
であり、textFile
がstd::fstream
派生物...
あなたが探している構文は
textFile.get( temp );