C ++检查行尾

时间:2019-07-11 20:01:20

标签: c++ string file end-of-line

我在C ++中遇到一个问题,我需要解析多行(随机长度的随机字符串)的文件,并将大写字符转换为小写字符,并将这些行存储在字符串向量中。 我试图逐个字符地解析文件,但是不知道如何识别行尾。

2 个答案:

答案 0 :(得分:1)

如果您真的想将一个行字符解析为一个字符,那么您需要做很多工作。而且,您在某种程度上取决于您的环境。行可以以'\ n'或'\ r'或“ \ r \ n”终止。

我真的建议您使用旨在获得完整代码的功能。这个函数是std::getline。如果您的行中不包含空格,则也可以使用提取器运算符直接读取一个字符串,如下所示:std::string s; ifstreamVariable >> s;

要独立于这种行为,我们可以实现一个代理类来读取完整的行并将其放入std::string中。

可以使用代理类和基于范围的向量构造函数将文件读入向量。

要转换为小写字母,我们将使用std::transform。那很简单。

请参见以下示例代码。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <sstream>

std::istringstream testDataFile(
R"#(Line 0 Random legth asdasdasfd
Line 1 Random legth asdasdasfd sdfgsdfgs sdfg
Line 2 Random legth asdasdasfd sdfgs sdfg
Line 3 Random legth a sddfgsdfgs sdfg
Line 4 Random legth as sds sg
)#");


class CompleteLine {    // Proxy for the input Iterator
public:
    // Overload extractor. Read a complete line
    friend std::istream& operator>>(std::istream& is, CompleteLine& cl) { std::getline(is, cl.completeLine); return is; }
    // Cast the type 'CompleteLine' to std::string
    operator std::string() const { return completeLine; }
protected:
    // Temporary to hold the read string
    std::string completeLine{};
};

int main()
{
    // Read complete source file into maze, by simply defining the variable and using the range constructor
    std::vector<std::string> strings{ std::istream_iterator<CompleteLine>(testDataFile), std::istream_iterator<CompleteLine>() };

    // Convert all strings in vector ro lowercase
    std::for_each(strings.begin(), strings.end(), [](std::string& s) { std::transform(s.begin(), s.end(), s.begin(), ::tolower); });

    // Debug output:  Copy all data to std::cout
    std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));

    return 0;
}

这是实现此类问题的“更多” -C ++方法。

顺便说一句,您可以替换istringstream并从文件中读取。没什么。

答案 1 :(得分:-2)

ifSteamObject.eof()用于检查文件的结尾

if(!obj.eof())
{
   //your code
}

使用此方法可以解决您的问题