检测空字符串值

时间:2014-07-27 12:13:09

标签: c++

我正在从ascii文件中读取,该文件包含图片中的信息。该文件看起来像

1,434,341,158,498,...直到一行像素结束。然后从下面开始下一个像素行 5,316,211,323,269,... 等等 重复,直到所有像素都被覆盖。

我正在尝试使用getline()将这些数据值写入数组进行处理。我的代码负责确定值的部分如下:

while(!asciiimage.eof()){   
string pixelvalue;
getline(asciiimage, pixelvalue, ',');
cout << pixelvalue << endl;
}

这循环直到文件结束。这适用于一行像素,但是在像素行的末尾,cout看起来像这样:

115
134

465
200

值之间存在差距。我想发现这个差距。我试图用

检测它
pixelvalue.length();
pixelvalue.size();

但这两个都没有成功。我怎样才能检测到像素值的空白值?

3 个答案:

答案 0 :(得分:2)

如果

if(pixelvalue.length() == 0)

没有帮助,那么它不是空的,但它有一些空格。特别是,该行的最后一个元素是换行符。在检查字符串是否空虚之前修剪字符串

boost::trim(pixelvalue);
if(pixelvalue.empty()) ...

有关修剪的更多信息,请see this question

或者,首先将整行读入字符串,不使用行终止字符,然后从字符串中读取值。

string line; 
while(getline(file, line))
{
   //optionally trim the line here.
   istringstream iss(line);
   string value;
   while(getline(iss, value, ',')
       cout << value << endl; 
}

答案 1 :(得分:0)

使用strtol转换为长值&amp;仅在非零值时打印。

pixelbits = strtol (pixelvalue.c_str(),&pEnd,16);
if(pixelbits)
  cout << pixelvalue << endl;

答案 2 :(得分:0)

你的主要问题可能是

 while(!asciiimage.eof()){ 

条件恕我直言。您可以在此处阅读更多有关推理的内容:Why is iostream::eof inside a loop condition considered wrong?


这就是我要做的事情

// Consider asciiimage is your text file input
std::istringstream asciiimage(R"input(1,434,341,158,498
5,316,211,323,269
42,508,645,232,2)input");

std::vector<std::vector<int>> pixelrows;
std::string line;
while(std::getline(asciiimage,line)) {
    pixelrows.push_back(std::vector<int>());
    std::istringstream linein(line);
    int num;
    while(linein >> num || !linein.eof()) { // << Note these different conditions
        if(linein.fail()) { // just clear the streams error state, and
                            // consume any characters, that don't fit your 
                            // expected formats
            linein.clear();
            char dummy;
            linein >> dummy;
            continue;
        }
        pixelrows.back().push_back(num);
    }
}

要输出/处理收集的像素值,您可以按照以下方式执行

for(auto itRow = pixelrows.begin();
    itRow != pixelrows.end();
    ++itRow) {
    for(auto itCol = itRow->begin();
        itCol != itRow->end();
        ++itCol) {
        if(itCol != itRow->begin()) {
            std::cout << ", ";
        }
        std::cout << *itCol;
    }
    std::cout << std::endl;
}

输出

1, 434, 341, 158, 498
5, 316, 211, 323, 269
42, 508, 645, 232, 2

请查看完整的working sample of the code here