确定单词后跟的是空格还是换行符
Figuring out if a word is followed by a space or newline
当前代码:
void LinkedList::readFunct( string file ) {
string word;
string trailing_char;
stringstream ss;
ifstream infile ( file.c_str() );
while ( getline( infile, word)) {
cout << "The line is " << word << endl;
ss << word;
while ( getline ( ss, word, ' ' )) {
trailing_char = "space";
cout << "Word: " << word << endl << "Trail: "<< trailing_char << endl;
}
ss.str( string() );
ss.clear();
}
}
代码尝试从文本文件(其名称传递给它)中提取,通读它,找到单词(用空格或换行符分隔),然后找出尾随字符(提到的空格或换行符)
所以像这样的文本文件:
abc def ghi
jkl mno pqr
应该有 abc 后跟一个空格,ghi 和 pqr 后跟一个新行(我知道实际上不会,但我将所有内容都分配给一个链表以供以后使用,我需要知道这是行的末尾)。
我已经试图弄清楚这个难题几个小时了,我处于智慧的尽头。帮助?
您首先使用 std::getline(in, word)
读取字符串,这将占用所有换行符。当你使用std::getline(in, word, ' ')
最后一个单词后面可能紧跟着什么都没有,即,它在行边界处。检查换行符和空格之间区别的方法是检查内部std::getline()
是否因为空格而停止,或者因为它到达了字符串的末尾,在这种情况下,它实际上停止了,因为以下字符是换行符:
while (std::getline( infile, word)) {
std::cout << "The line is '" << word << "'n";
ss.clear();
ss.str(word);
while (std::getline (ss, word, ' ' )) {
trailing_char = ss.eof()? "newline": "space";
cout << "Word: " << word << endl << "Trail: "<< trailing_char << 'n';
}
}
一种更简单的方法是一次只读一个单词的文件,然后打印单词后面的字符是否存在、空格还是换行符(或其他空格字符之一):
for (std::string word; infile >> word; ) {
switch (infile.peek()) {
case 'n': trail = "newline"; break;
case 'r': trail = "carriage-return"; break;
case ' ': trail = "space"; break;
case 'f: trail = "form-feed"; break;
// ...?
default: trail = "end-of-file"; break;
}
std::cout << "word='" << word << "' trail=" << trail << 'n';
}
好吧,默认情况下getline
用换行符分隔,所以这应该是你所需要的。例:
std::ifstream infile("text.txt");
for (std::string line; std::getline(infile, line); )
{
std::istringstream iss(line);
bool firstword = true;
for (std::string word; iss >> word; )
{
if (!firstword) { std::cout << "SPACEn"; }
std::cout << word;
firstword = false;
}
std::cout << "NEWLINEn";
}
布尔标志的复杂性在于,你的空格比你的单词少一个。
我编辑了你的代码:
void LinkedList::readFunct( string file ) {
string word;
string trailing_char;
stringstream ss;
ifstream infile ( file.c_str() );
while ( getline( infile, word)) {
cout << "The line is " << word << endl;
ss << word;
bool firsttime = true;
while ( ss >> word ) {
if (!firsttime)
cout << "Trail: space" << endl;
cout << "Word: " << word << endl;
firsttime = false;
}
if (!firsttime)
cout << "Trail: NEWLINE" << endl;
else
cout << "empty line." << endl;
ss.str( string() );
ss.clear();
}
}
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- QRegExp 删除换行符和多个空格
- 如何将换行符按钮更改为空格以完成从输入流的读取
- 如何检查字符串是否包含空格/制表符/换行符(任何空白内容)?
- 使用 getchar() 输入字符的最有效方法,就像 cin 中没有换行符和空格字符一样C++
- 确定单词后跟的是空格还是换行符
- C++:抓取文件的每个字符,忽略换行符和空格
- 如何在C++中将空格和换行符分隔的整数读取到2D数组中
- 如何从包含空格和换行符的文本文件中提取特定数据
- 从文件中读取空格分隔的数字,直到换行符
- Clang:在单行注释中以空格分隔的反斜杠和换行符
- 用cin处理空格并返回(换行符)
- 读取由空格或换行符分隔的输入.