2010-11-16 92 views
2

我正在打开一个文件,并从中获取行。 第一行应该说有多少变量,以及它们的名字是什么。 第二行应该是使用这些变量的逻辑方程。 这个任务是让它打印出一个变量和方程的真值表。字符串在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)) 

我认为无论是造成这是给我的整个问题其余的程序也是如此。在标记变量行之后,它不打印没有换行符,并且在计算公式时没有找到第二个变量。

+3

printf和cout一起发现 – Chubsdad 2010-11-16 20:41:46

+0

'while(!inFile.eof()){'< - No. No. No. – 2010-11-16 21:53:16

+0

尝试读心术。重新阅读我的答案。 – 2010-11-17 03:02:54

回答

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

@Chubsdad这是正确的。 – 2010-11-16 20:43:01

+0

@Chubsdad:是的。上次我检查了微软的实现,它只是在流中插入一个'\ n',并自动刷新它。 – 2010-11-16 20:52:52

+0

这并没有解决问题。我是否在输入文件的方法上做错了什么?我觉得第一行的结尾是搞错了所有其他事情。 – 2010-11-17 00:12:12

0

如果我所看到的是正确的,printf的输出是没有显示的输出。在这种情况下,无论是使用

fflush(stdout); 

或者更好的,只是去用一个std ::法院的该行,因为你在写C++它(当然使用std::flush技术。)