3

我的文本文件如下所示:

987 10.50   N   50
383 9.500   N   20
224 12.00   N   40

我只想读取第二列数据。我该怎么做呢?

4

4 回答 4

5

您不能只阅读第二列而不阅读其他任何内容。

您可以做的是读取所有数据,并忽略除第二列之外的所有内容。例如,读取一行数据(带有std::getline),然后从中提取 anint和 a double,但忽略int该行的其余部分。

于 2013-03-11T18:20:49.993 回答
5

您需要读取所有数据,并丢弃不需要的字段(即“列”)。包含的格式字符串%*d正在这样做。

C中,它可能类似于(假设fFILE*句柄)

 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。感谢杰里·科芬的评论

于 2013-03-11T18:22:27.917 回答
2

C89/C90 具有strtok可用于逐行读取文件的功能,使用“空格”分隔符分隔列,然后您可以访问第 n 个标记(表示文件中该行中的第 n 列)。

strtok被声明在

http://cplusplus.com/reference/cstring/

一些实现也有一个线程安全的可重入版本,称为strtok_r.

于 2013-03-11T18:39:21.153 回答
1

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它将列数据读入变量。

于 2014-08-03T09:15:06.497 回答