我正在处理一个函数,该函数读取文件的行,直到文件中到达“XXX”行,并且计数器记录已读取的行数。然后程序计算文件中的剩余行数。我正在使用if语句来确定何时打破while循环(当行读取等于“XXX”时)且条件未满足。即使line ==“XXX”,else语句仍然会运行。我的代码出了什么问题?谢谢!
#include <string>
#include <iostream>
#include <fstream>
using std::string;
using std::endl;
using std::cout;
using std::ifstream;
int main()
{
//Main function
}
void read_file(string input_file_name)
{
string i_filename = input_file_name;
ifstream infile;
infile.open (i_filename);
string line;
int num_of_terms1 = 0;
int num_of_terms2 = 0;
if (!infile)
{
cout << "Your input file could not be opened."<<endl;
}
else
{
while (!infile.eof())
{
getline(infile, line);
cout << line << endl;
if (line == "XXX")
{
break;
}
else
{
cout << line << endl;
num_of_terms1++;
}
}
while (!infile.eof())
{
getline(infile, line);
cout << line << endl;
num_of_terms2++;
}
}
cout << "Terms 1: "<<num_of_terms1 <<endl;
cout << "Terms 2: "<< num_of_terms2 <<endl;
infile.close();
}
这是一个示例输入文件inputfile.txt:
-2 3
4 2
XXX
-2 3
提前感谢您的帮助!
答案 0 :(得分:1)
首先,您应该阅读:Why is iostream::eof inside a loop condition considered wrong?
第二个调试行:
cout << line << endl;
在两种情况下完全相同 - 你在else语句中或者你在计算num_of_terms2
并且它令人困惑。更改它们,以便您可以看到打印的是哪一个。
修复问题后,您会看到“else语句仍然无法运行”
答案 1 :(得分:1)
我在www.compileonline.com上测试了这段代码并重复了你的发现。
在该环境中,从文件读取的每个字符串在其末尾都有一个\ r \ n字符。
当我将终止行更改为if (line == "XXX\r")
时,代码按预期工作。
您的输入文件的行似乎以&#34; \ r \ n&#34;这是Windows的标准,但unix文本文件通常以&#39; \ n&#39;终止。
更新
这是一个关于如何删除尾随回车和换行符(或者你想要的任何其他内容)的小演示:
#include <string>
#include <algorithm>
#include <iostream>
void trim_cruft(std::string& buffer)
{
static const char cruft[] = "\n\r";
buffer.erase(buffer.find_last_not_of(cruft) + 1);
}
void test(std::string s)
{
std::cout << "=== testing ===\n";
trim_cruft(s);
std::cout << s << '\n';
}
int main()
{
test(""); // empty string
test("hello world\r"); // should trim the trailing \r
test("hello\nworld\r\n"); // don't trim the first newline
}
答案 2 :(得分:0)
正如我在评论中所说,你有两个cout
语句,你应该验证哪一个正在打印XXX
。如果它们都不是,那么很可能问题是字符串中有回车符,你可以用以下方法验证这个案例:
cout << line << endl; // print is here
if (line == "XXX\r")
{
break;
}
else
{
cout << line << endl; // print is here
num_of_terms1++;
}