读取特定行中的值(可变数量的值)并将它们存储在数组中

时间:2015-03-08 20:18:10

标签: c++ arrays file

我有一个.txt文件,其中包含我需要使用的几千行浮点值。我不知道每个特定行有多少值。我想将一行中的所有值存储到一个数组中。

这就是我到目前为止所做的一切:

string line;
int row = 0;
ifstream file_input (input.c_str());
while ( getline(file_input, line) )
{
    row++;
    if (row == 8)    // if I want to read the 8th line
    {
        cout << line;
    }
}

此代码打印第8行的所有内容,这是一个很大的值。我想将所有这些值存储到一个数组中。 我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

您可以使用std::stringstream(或std::istringstream)从该行读取这些float并将其推入std::vector

std::vector<float> vec;
std::string line;
std::ifstream file_input (input);
int row = 0;
while (getline(file_input, line))
{
    ++row;

    if (row == 8)    // if I want to read the 8th line
    {
        cout << line;

        std::istringstream iss(line);
        float value; // auxiliary variable to which you extract float from stringstream

        while(iss >> value)        // yields true if extraction succeeded
            vec.push_back(value);  // and pushes value into the vector

        break;
    }
}

或者看一些更专业的方式this post

答案 1 :(得分:0)

由于您已将文件的一行放入字符串中,因此您可以将字符串转换为 char vector 并创建 char * 指向此向量并将 char * 作为第一个参数传递给以下函数:

char * strtok(char * str,const char * delimiters);

您案例中的第二个参数将是一个空格&#34; &#34 ;.接收到的char指针然后可以转换为float,每个令牌都可以存储在数组中!

int nums(char sentence[ ])  //function to find the number of words in a line
    {
     int counted = 0; // result

    // state:
    const char* it = sentence;
    int inword = 0;

    do switch(*it) {
        case '\0': 
        case ' ': case '\t': case '\n': case '\r': 
            if (inword) { inword = 0; counted++; }
            break;
        default: inword = 1;
    } while(*it++);

    return counted;
}

int main()
{
ifstream file_input (input.c_str());
int row=0;
while ( getline(file_input, abc) )
{

vector<char> writable(abc.begin(), abc.end());
vector<char> buf(abc.begin(), abc.end());

writable.push_back('\0');
buf.push_back('\0');

char *line=&writable[0];

char *safe=&buf[0];


char* s= "123.00";

        float array[100];
        char *p;
        int i=0;

       p= strtok (line, " ");
       array[i]=atof(p);
       cout<<" "<<array[i];

       i++;
         while (i<nums(safe))
          {
              p = strtok (NULL, " ");   //returns a pointer to the token
              array[i]=atof(p);
              cout<<" "<<array[i];
              i++;
          }
     return 0;
}

不幸循环:而(p!= NULL)没有用完并导致分段错误所以我不得不预先计算单词数在使用另一个向量的行中,因为 strtok()修改了作为 char * 传递给它的字符串。