我正在从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();
但这两个都没有成功。我怎样才能检测到像素值的空白值?
答案 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