のstd::ostream
出力をフラッシュする必要があります。通常、改行\n
が書き込まれると自動的にフラッシュされます。std::flush
ストリームを強制的にフラッシュする場合は、次のようにマニピュレータを使用できます。
std::cout << "foo" << std::flush;
編集\n
:私の投稿は「文字を出力しないと行が表示されないのはなぜですか?」という質問に明確に答えていますが。あなたはこれがあなたの質問に答えないと言ったので、私はあなたの本当の質問に答えるためにいくつかの心を読んでみます。
私はあなたが本当に知りたいことを知らないので、ここであなたのコードに間違っているいくつかのことを指摘します。それはあなたがあなたの問題を見つけたりあなたの質問を明確にするのに役立つかもしれません。
まず、から入力したファイル名を使用している場合std::cin
、argc<2
100%保証されている場合、アプリケーションで障害が発生します。その理由は、が指す文字バッファーinFileName
に、終了ヌル文字用に予約された1バイトが含まれているためです。誰かがテキストを入力すると、バッファオーバーランが発生します。誰かが空の文字列を入力すると、プログラムはファイルを開かず、チェックしていないエラーコードを返すため、プログラムはクラッシュしませんが、それでも機能しません。inFile.open(...);
第2に、他の行入力は不必要に256文字に制限されており、同様に危険です(つまり、256文字より長い行はbuferオーバーランを引き起こします)。最終的std::string
にはコンテンツからインスタンスを作成するので、単純にを使用する必要がありますstd::getline()
。入力するのが短く、より一般的で安全です。
\n
第三に、問題の説明は、文字を追加しない限り出力が生成されないということです。私が説明したように、これは完全に正常です。あなたの投稿を読み直すと、入力ファイルにすでに1つあるのに、なぜ追加する必要があるのか理解できないことがわかります。追加する必要があるのは、getline()
関数が文字を破棄するため\n
です。行のバッファには挿入されません。
いくつかの明確な改善を示すために、コードの一部をクリーンアップしました。このコードから、プログラムの構造を理解することができます。これは、入力の構造も反映している必要があります。
#include "truthTable2.h"
int main(int argc, const char* argv[]){
std::ifstream inFile;
if(argc != 2){
cout << "Enter an input file name: ";
std::string inFileName;
std::getline(std::cin, inFileName);
inFile.open(inFileName.c_str());
}
else {
inFile.open(argv[1]);
}
if ( !inFile.is_open() ) {
// Did not successfully open a file. Print error message and exit!
}
TruthTable tTable;
for (std::string variables; std::getline(inFile,variables); )
{
std::cout << variables << std::endl;
tTable.setVariables(variable);
std::string formula std::getline(formula);
std::cout << formula << std::endl;
tTable.setFormula(formula);
tTable.printTable();
}
return 0;
}
これから、私は質問があります:あなたの入力はどのように構造化されていますか?入力ファイルは2行だけで構成されていますか?これらのラインペアのセットは複数ありますか?変数と方程式の束を含む単一の行はありますか?これらの3つのケースでは、次のいずれかの方法でプログラムを再構築することになります。
2行のみ:
ThruthTable table;
std::string variables, equation;
std::getline(file, variables);
std::getline(file, equation);
// ...
複数のセット:
while ( !inFile.eof() )
{
ThruthTable table;
std::string variables, equation;
std::getline(file, variables);
std::getline(file, equation);
// ...
}
複数の方程式:
ThruthTable table;
std::string variables;
std::getline(variables);
for ( std::string equation; std::getline(file, equation); )
{
std::getline(file, equation);
// ...
}