将第一列数据文件读取为字符串

时间:2014-08-06 16:43:05

标签: c++

我有一个像这样的dat文件

AAAA     1861    9   7   0.00    -1.50   -19.50      9999.00     9999.00     9999.00     9999.00     18.20   9999.00     6.70    135.00      8.00    9999.00     9999.00     9999.00     9999    0   193        250180280600000000 
BBBBBBBBB    1861    9   7   0.00    -7.50   36.50   9999.00     9999.00     21.40   1018.10     22.60   9999.00     1.00    68.00   2.00    9999.00     9999.00     9999.00     9999    0   193        451720280600000000 
VVVVVVVVV    1861    9   7   0.00    -58.50      10.50   9999.00     9999.00     27.50   9999.00     26.90   9999.00     15.40   45.00   6.00    9999.00     9999.00     9999.00     9999    0   193        357610280600000000 
SSSSSSSS     1861    9   7   0.00    117.50      13.50   9999.00     9999.00     28.00   1010.30     28.00   9999.00     4.60    158.00      5.00    9999.00     9999.00     9999.00     9999    0   193        370170280600000000 
DD   1861    9   7   1.00    -19.50      6.50    9999.00     9999.00     24.70   1014.80     25.30   9999.00     6.70    203.00      2.00    9999.00     9999.00     9999.00     9999    0   193        343600280600000000 
E    1861    9   7   1.00    44.50   -28.50      9999.00     9999.00     20.40   9999.00     19.00   9999.00     2.60    135.00      2.00    9999.00     9999.00     9999.00     9999    0   193        218240280600000000 
ZZZZZZZZZZZZ     1861    9   7   1.00    -15.50      38.50   9999.00     9999.00     22.00   9999.00     21.90   9999.00     6.70    68.00   2.00    9999.00     9999.00     9999.00     9999    0   193        458840280600000000 

我希望将文件的第一列存储在字符串向量中。有什么想法吗?

这就是我试过的

for(int k=0;k<ROW;k++){
   INNA >> ID;                      
   for(int j=1;j<=COL;j++) INNA >> discardID; 
   IDname[k]= ID;
} 

但在ID I中,所有列都是唯一的字符串..

非常感谢

3 个答案:

答案 0 :(得分:8)

这就是我要解决的问题:

#include <fstream>
#include <strtk.hpp>   // http://www.partow.net/programming/strtk


std::string filename("your_input_data.txt");

// assuming the file is text
std::fstream fs;
fs.open(filename.c_str(), std::ios::in);

if(fs.fail())  return false;   

const char *whitespace    = " \t\r\n\f";

std::string keyword;
std::vector<float> floats;
std::vector<string> keywords;

// process each line in turn
while( std::getline(fs, line ) )
{

// remove beginnning and ending whitespace
// can prevent parsing problems
// from different line endings.
strtk::remove_leading_trailing(whitespace, line);

    // strtk::parse combines multiple delimeters in these cases

    if( strtk::parse(line, whitespace, keyword, floats ) ) 
    {
         std::cout << "succeed" << std::endl;
     // keyword contains the string and the rest of the values
     // are placed in the floats vector
     keywords.push_back( keyword );

     // you can also process the numbers
    }

}

答案 1 :(得分:2)

阅读整行,然后获取第一列。

#include <string>
#include <iostream>
#include <sstream>
#include <vector>

std::vector<std::string> vec;
std::string line;
while (std::getline(std::cin, line)) {
    std::istringstream strm(line);
    std::string firstcol;
    strm >> firstcol;
    vec.push_back(firstcol);
}

答案 2 :(得分:0)

或者在C中,您可以只读取第一列并丢弃剩余的。像这样:

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int main( )
{
    FILE * fp = NULL;
    fp = fopen("filename", "r");

    if (!fp)
        return -1;

    char buffer[256];
    char ** IDname = NULL;
    int idcount = 0;
    while (fscanf(fp, "%s %*[^\n]", buffer) == 1)
    {
        idcount++;
        IDname = realloc(IDname, idcount * sizeof * IDname);
        IDname[idcount - 1] = strdup(buffer);
    }

    return 0;
}