vector<string> wordstocheck;
in.open("readin.txt");
string line;
string word = "";
int linecount = 0;
while (getline(in, line))
{
//cout << line << endl;
for (int i = 0; i < line.size(); i++)
{
if(isalpha(line[i]))
{
word.push_back(tolower(line[i]));
}
else if (line[i] == ' ' || ispunct(line[i]) || line[i] == '\n')
{
wordstocheck.push_back(word);
word = "";
}
}
linecount++;
}
for (int i = 0; i < wordstocheck.size(); i++)
{
cout << wordstocheck[i] << endl;
}
system("pause");
}
上面的代码从.txt文件中读取以下内容:
If debugging is the
process of removing bugs.
Then programming must be the
process of putting them in.
我试图让程序识别每个单词,并将单个单词保存到向量中,然后打印出该单词向量。除了第一行和第三行中的两个&#39之外,它做得很好。
Output:
if
debugging
is
theprocess
of
removing
bugs
then
programming
must
be
theprocess
of
putting
them
in
Press any key to continue . . .
它没有分裂&#34;过程&#34;正如我所希望的那样。
答案 0 :(得分:3)
getline
不会阅读换行符。但是,在这种情况下,解决此问题相对简单。
您当前拥有linecount++;
的位置,请在其前添加以下行:
if (word != "")
{
wordstocheck.push_back(word);
word = "";
}
您可能希望在将if (word != "")
推到word
的第一个位置使用相同的wordstocheck
,因为如果文字有“A Word”,则您需要添加该字词“A”后跟一个空字,因为秒空间触发要添加到列表中的单词。
作为替代方案,您可以摆脱getline,只需使用int ch = in.get()
一次从输入中读取一个字符。然后,而不是计算while()...
内的行,并通过循环使用ch
而不是line[i]
al,然后在else if
部分中添加第二个,以检查换行并计算行数。这可能会缩短代码。
答案 1 :(得分:1)
我认为问题在于您希望换行符包含在getline()
的结果中,而不是wordstocheck.push_back(word);
word = "";
。看起来如果你拿走那块你已经拥有的两条线:
linecount++;
并将它们添加到该行旁边:
{{1}}
然后它应该按预期工作。
答案 2 :(得分:0)
如果您想一次阅读一个字,为什么首先使用std::getline
?
// read the words into a vector of strings:
std::vector<std::string> words{std::istream_iterator<std::string(in),
std::istream_iterator<std::string()};
您可以使用std::for_each
或std::transform
将所有内容转换为小写字母,最后使用for (auto const &w : words) std::cout << w << "\n";
答案 3 :(得分:0)
到目前为止,我知道,getline读取整行并且不识别回车。我知道的唯一方法是读取文件,通过char读取char。 这是一个给出正确结果的例子:
#include <iostream> // std::cin, std::cout
#include <fstream> // std::ifstream
int main ()
{
char str[256];
int line = 1;
int charcount = 0;
std::cout << "Enter the name of an existing text file: ";
std::cin.get (str,256);
std::ifstream is(str);
if (!is)
{
std::cerr << "Error opening file!" << std::endl;
return -1;
}
char c;
while ((c = is.get()) && is.good()) // loop while extraction from file if possible
{
if (c == 10 || c == 13 || c == 32) // if it is a line break or carriage return or space
{
std::cout << std::endl;
line++;
}
else // everything else
{
std::cout << c;
charcount++;
}
}
is.close();
std::cout << std::endl; // close file
std::cout << line << " lines" << std::endl;
std::cout << charcount << " chars" << std::endl;
return 0;
}