从C中的文本文件中读取特定的数据列

时间:2013-03-11 18:18:05

标签: c++ c

我的文本文件如下所示:

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

我想只读第二列数据。我怎么会这样做?

4 个答案:

答案 0 :(得分:5)

如果不阅读其他内容,您不能只阅读第二栏。

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

答案 1 :(得分: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。感谢Jerry Coffin的评论

答案 2 :(得分:2)

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

strtok

中声明

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

某些实现还具有名为strtok_r的线程安全可重入版本。

答案 3 :(得分:0)

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将列数据读入vaiables。