2

我以下列方式使用 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工具和苹果工具修改)。一些行尾字符是 \r 而不是 \n,所以我的文件字符串永远不会分成几行。我相信还有第三个我应该检查。我找不到为多个 endOfLine 字符设置 delim 参数的示例。

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

4

1 回答 1

3

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

于 2012-12-21T19:35:54.207 回答