我正在打开一个文件,并从中获取行。 第一行应该说明有多少变量,以及它们的名称是什么。 第二行应该是使用这些变量的逻辑方程。 赋值是打印出变量和方程的真值表。
如果没有插入换行符号,程序输入的第一行就不会打印。我尝试转换为字符串并同时使用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进行标记后,如果没有新的行字符则不会打印,并且在评估公式时它不会找到第二个变量。
答案 0 :(得分:5)
需要刷新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);
// ...
}
答案 1 :(得分:0)
如果我看到的是正确的,则printf的输出是未显示的输出。在这种情况下,要么使用
fflush(stdout);
或者更好的是,只需使用std :: cout为该行,因为你用C ++编写它(当然使用std::flush
技术。)