gpt4 book ai didi

c++ - 将 get line() 与多种类型的行尾字符一起使用

转载 作者:行者123 更新时间:2023-11-30 04:22:06 24 4
gpt4 key购买 nike

我按以下方式使用 std::getline():

 std::fstream verify;
verify.open(myURI.c_str());
std::string countingLine;

if(verify.is_open()){

std::getline(verify, countingLine);

std::istringstream iss(countingLine);
size_t pos;

// Check for the conventional myFile header.
pos = iss.str().find("Time,Group,Percent,Sign,Focus");

if(pos == std::string::npos){//its not there
headerChk = false;
this->setStatusMessage("Invalid header for myFile file");
return 0;
}

// loop that does more validation

iss.clear();

}

问题是我在 mac 上编码(有些文件同时使用 Windows 工具和 Apple 工具进行了修改)。一些行尾字符是\r 而不是\n,所以我的文件字符串永远不会被分成多行。我相信还有第三个我应该检查。我找不到为多个 endOfLine 字符设置 delim 参数的示例。

如果有人可以帮助解决该示例或其他方法,那就太好了。谢谢

最佳答案

std::getline() 仅支持一个行尾字符。以文本模式打开文件时,系统的行尾序列将转换为一个单行尾字符 (\n)。但是,这不处理来自其他系统的行尾字符序列。实际上,真正需要做的就是从保留的输入中删除 \r 字符。删除字符的最佳方法可能是创建一个过滤流缓冲区。这是一个微不足道的、未经测试的,而且可能很慢的一个(它不是缓冲,这意味着每个单独的字符都有虚函数调用;这太可怕了;创建一个缓冲版本并不难,不过):

class normalizebuf
: std::streambuf {
std::streambuf* sbuf_;
char buffer_[1];
public:
normalizebuf(std::streambuf* sbuf): sbuf_(sbuf) {}
int underflow() {
int c = this->sbuf_->sbumpc();
while (c == std::char_traits<char>::to_int_type('\r')) {
c = this->sbuf->sbumpc();
}
if (c != std::char_traits<char>::eof()) {
this->buffer_[0] = std::char_traits<char>::to_char_type(c);
this->setg(this->buffer_, this->buffer_, this->buffer_ + 1);
}
return c;
};

您可以将此过滤器与现有的流缓冲区一起使用,如下所示:

std::ifstream fin("foo");
normalizebuf sbuf(fin.rdbuf());
std::istream in(&sbuf);

...然后您将使用 in 读取删除了所有 \r 字符的文件。

关于c++ - 将 get line() 与多种类型的行尾字符一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13995971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com