繁体   English   中英

没有在C ++中没有换行符的情况下无法打印字符串

[英]String is not printing without new line character in C++

我正在打开一个文件,并从中获取行。 第一行应该说有多少个变量,它们的名字是什么。 第二行应该是使用这些变量的逻辑方程式。 分配是要为变量和方程式打印出真值表。

程序插入的第一行在没有插入新行字符的情况下不会打印。 我尝试转换为字符串并同时使用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之后,如果没有换行符,它将不会打印,并且在计算公式时不会找到第二个变量。

std::ostream的输出需要刷新。 写入换行符\\n时,通常会自动将其刷新。 如果要强制刷新流,则可以使用std::flush操纵器,如下所示:

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

编辑 :虽然我的帖子清楚地回答了以下问题:“为什么除非我输出\\n字符,否则我的行才会显示出来?” 您说这不能回答您的问题,所以我将尝试阅读一些心得来尝试回答您的真实问题。

由于我不知道您真正想知道什么,因此在这里我将指出一些代码错误的地方,这可能有助于您发现问题或阐明问题。

首先,如果您使用的是从std::cin输入的文件名,则当argc<2 ,将100%保证会导致应用程序失败。 原因是inFileName指向的字符缓冲区包含一个字节,保留给终止空字符。 如果用户输入任何文字无论如何 ,你会得到一个缓冲区溢出。 如果有人输入一个空字符串,您的程序将不会打开任何文件,并且inFile.open(...); 会返回您未检查的错误代码,因此您的程序不会崩溃,但仍然无法运行。

其次,其他行输入不必要地限制为256个字符,并且同样危险(即,行长于256个字符将导致缓冲区溢出)。 由于您最终会在内容之外创建std::string实例,因此应该只使用std::getline() 它更短,更通用,更安全。

第三,对问题的描述是除非添加\\n字符,否则不会生成任何输出。 正如我所解释的,这是完全正常的。 通过重新阅读您的帖子,我可以理解,您不会理解为什么在输入文件中已经有一篇文章的情况下为什么必须添加一篇文章。 您需要添加它的原因是因为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行吗? 这些线对有多套吗? 是否有单行包含变量和一堆方程式? 这三种情况将导致我以下列方式之一重新构建程序:

仅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);
    // ...
}

如果我看到的是正确的,则printf的输出是未显示的输出。 在这种情况下,请使用

fflush(stdout);

或者更好的做法是,在该行中使用std :: cout,因为您是用C ++编写的(当然,使用std::flush技术)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM