2

ファイルを開いて、そこから行を取得しています。最初の行には、変数の数とその名前を記載する必要があります。2行目は、これらの変数を使用した論理方程式である必要があります。割り当ては、変数と方程式の真理値表を出力させることです。

プログラムが取り込む最初の行は、改行文字を挿入しないと印刷されません。文字列に変換して、printfとcoutの両方を使用してみました。

すべてを入力するメインファイル:

#include "truthTable2.h"

int main(int argc, const char* argv[]){
  ifstream inFile;
  if(argc != 2){
    cout << "Enter an input file name: ";
    char *inFileName = "";
    cin >> inFileName;
    inFile.open(inFileName);
  }
  else
    inFile.open(argv[1]);
  TruthTable tTable;
  while(!inFile.eof()){
    char variableLine[256];
    inFile.getline(variableLine, 256);
    printf("%s ", variableLine);
    string variable(variableLine);
    tTable.setVariables(variable);
    char formulaLine[256];
    inFile.getline(formulaLine, 256);
    cout << formulaLine << "\n";
    string formula(formulaLine);
    tTable.setFormula(formula);
    tTable.printTable();
  }
  inFile.close();
  return 0;
}

サンプル入力:

2 x y
( \wedge x ( \not y ) )

これからの出力:

 ( \wedge x ( \not y ) )

これを引き起こしているものは何でも、プログラムの残りの部分でも問題を引き起こしていると思います。variableLineをトークン化した後、改行文字がないと印刷されず、数式を評価するときに2番目の変数が見つかりません。

4

2 に答える 2

5

std::ostream出力をフラッシュする必要があります。通常、改行\nが書き込まれると自動的にフラッシュされます。std::flushストリームを強制的にフラッシュする場合は、次のようにマニピュレータを使用できます。

std::cout << "foo" << std::flush;

編集\n:私の投稿は「文字を出力しないと行が表示されないのはなぜですか?」という質問に明確に答えていますが。あなたはこれがあなたの質問に答えないと言ったので、私はあなたの本当の質問に答えるためにいくつかの心を読んでみます。

私はあなたが本当に知りたいことを知らないので、ここであなたのコードに間違っているいくつかのことを指摘します。それはあなたがあなたの問題を見つけたりあなたの質問を明確にするのに役立つかもしれません。

まず、から入力したファイル名を使用している場合std::cinargc<2100%保証されている場合、アプリケーションで障害が発生します。その理由は、が指す文字バッファー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);
    // ...
}
于 2010-11-16T20:39:21.643 に答える
0

私が見ているものが正しければ、printfからの出力は表示されていないものです。その場合は、どちらかを使用してください

fflush(stdout);

または、C ++で記述しているので、その行にはstd :: coutを使用することをお勧めします(std::flushもちろん、この手法を使用します)。

于 2010-11-16T21:26:50.233 に答える