我的文本文件如下所示:
987 10.50 N 50
383 9.500 N 20
224 12.00 N 40
我只想读取第二列数据。我该怎么做呢?
您不能只阅读第二列而不阅读其他任何内容。
您可以做的是读取所有数据,并忽略除第二列之外的所有内容。例如,读取一行数据(带有std::getline
),然后从中提取 anint
和 a double
,但忽略int
该行的其余部分。
您需要读取所有数据,并丢弃不需要的字段(即“列”)。包含的格式字符串%*d
正在这样做。
在C中,它可能类似于(假设f
是FILE*
句柄)
while (!feof(f)) {
int n=0; double x=0.0; char c[4]; int p=0;
if (fscanf(f, " %*d %f %*[A-Z] %*d", &x) < 1)
break;
do_something(x);
}
PS。感谢杰里·科芬的评论
C89/C90 具有strtok
可用于逐行读取文件的功能,使用“空格”分隔符分隔列,然后您可以访问第 n 个标记(表示文件中该行中的第 n 列)。
strtok
被声明在
http://cplusplus.com/reference/cstring/
一些实现也有一个线程安全的可重入版本,称为strtok_r
.
在C++中,您可以考虑使用std::istringstream
,这需要包含:#include <sstream>
。就像是:
std::ifstream ifs("mydatafile.txt");
std::string line;
while(std::getline(ifs, line)) // read one line from ifs
{
std::istringstream iss(line); // access line as a stream
// we only need the first two columns
int column1;
float column2;
iss >> column1 >> column2; // no need to read further
// do what you will with column2
}
这样做std::istringstream
是允许您像对待std::string
常规文件一样对待输入流。
您可以使用iss >> column1 >> column2
它将列数据读入变量。