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

Posted

技术标签:

【中文标题】读取特定行中的值(可变数量的值)并将它们存储在数组中【英文标题】:Read values in a specific line (variable number of values) and store them in an array 【发布时间】:2015-03-08 20:18:10 【问题描述】:

我有一个 .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 行的所有内容,一共是大量的值。我想将所有这些值存储到一个数组中。 我该怎么做?

【问题讨论】:

【参考方案1】:

您可以使用std::stringstream(或std::istringstream)从行中读取那些floats,并将它们推送到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了解更专业的方法。

【讨论】:

【参考方案2】:

既然你已经把文件的一行变成了一个字符串,你可以把这个字符串转换成一个charvector,做成一个char* em> 指向该向量并将 char* 作为第一个参数传递给以下函数:

char * strtok (char * str, const char * 分隔符);

在您的情况下,第二个参数将是一个空格“”。然后可以将接收到的 char 指针转换为浮点数,并将每个令牌存储在数组中!

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;

不幸的是循环:while(p!=NULL) 无法正常工作并导致分段错误,因此我不得不预先计算字数在使用另一个向量的行中,因为 strtok() 修改了作为 char* 传递给它的字符串。

【讨论】:

以上是关于读取特定行中的值(可变数量的值)并将它们存储在数组中的主要内容,如果未能解决你的问题,请参考以下文章

使用流在 C++ 中读取可变长度输入

协助表格添加行中的值并使用按钮删除它们。使用 jQuery

如何根据特定行中的值对 numpy 数组进行排序?

根据 CSV 文件行中的值确定数据类型

如何使用Python计算数组特定行中的值[重复]

传递可变数量的实参