将字符串和数字读取到向量C

read string and numbers to vector c++

本文关键字:向量 读取 数字 字符串      更新时间:2023-10-16

当我的文件 s2.txt看起来像

时,我该怎么办
ID 1 (string) 
22 30 30 4 2 4 5 7 5 3 ......................................(a few lines   
of numbers) 
ID 2
30 4 2 1 2 ................................. (other lines of numbers)

我想将数字保存到向量,但它不起作用:

void readFromFile (){
      ifstream file("s2.txt");
      if( file.good() == true )
          cout << "open" << endl;
      else
          cout << "denied" << endl;
      int m=0;
      while(!file.eof()) {
        string ID;
        int qual;
        vector <int> quality;
        getline(file,ID);
        while (file>>qual) {
          quality.push_back(qual);
          cout<<quality[m]<<endl;
          m++;
        }
      }
      file.close();
    }
}
main () {
readFromFile();
}

当我单击"运行"时,仅保存一个数字字符串(对于ID1(。

ps。阅读ID并不重要。

您应该将每行读取到字符串。然后检查" ID"字符串。如果在行的位置0处找到" ID"字符串,则将该行读为ID行,如果不是,则将该行读为整数数字。

正如Linh Dao答案所建议的,我做了一个相应的示例代码:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
void readFromFile(std::istream &in)
{
  if (!in.good()) {
    std::cerr << "ERROR!" << std::endl;
  }
  std::string buffer;
  std::vector<int> quality;
  while (std::getline(in, buffer)) {
    if (buffer.size() >= 2 && buffer.compare(0, 2, "ID") == 0) {
      std::cout << buffer << std::endl;
      quality.clear(); // reset quality vector
    } else {
      // read numbers
      std::istringstream in(buffer); int qual;
      while (in >> qual) {
        quality.push_back(qual);
        std::cout << quality.back() << std::endl;
      }
    }
  }
}
int main(void)
{
#if 0 // in OP
  { std::ifstream fIn("s2.txt");
    readFromFile(fIn);
  } // fIn goes out of scope -> file is closed
#else // instead
  readFromFile(std::cin);
#endif // 0
  return 0;
}

输入:

ID 1 (string) 
22 30 30 4 2 4 5 7 5 3
22 30 30 4 2 4 5 7 5 3
ID 2
30 4 2 1 2

输出:

ID 1 (string) 
22
30
30
4
2
4
5
7
5
3
22
30
30
4
2
4
5
7
5
3
ID 2
30
4
2
1
2

iDeone 的生活演示。

注意:

逐行读取输入流(进入std::string buffer(。进一步的处理取决于输入缓冲区内容是否以ID开头。如果不是,则bufferstd::istringstream一起提取int数字。


如果我正确理解了评论,则提问者打算在每次迭代中输出整个收集的quality矢量。因此,我修改了第一个样本,并为std::vector<int>添加了operator<<()

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
// a stream operator for vector<int> ouput
std::ostream& operator<<(std::ostream &out, const std::vector<int> &values)
{
  const char *sep = "";
  for (int value : values) {
    out << sep << value; sep = " ";
  }
  return out;
}
void readFromFile(std::istream &in)
{
  if (!in.good()) {
    std::cerr << "ERROR!" << std::endl;
  }
  std::string buffer;
  std::vector<int> quality;
  while (std::getline(in, buffer)) {
    if (buffer.size() >= 2 && buffer.compare(0, 2, "ID") == 0) {
      std::cout << buffer << std::endl;
      quality.clear(); // reset quality vector
    } else {
      // read numbers
      std::istringstream in(buffer); int qual;
      while (in >> qual) {
        quality.push_back(qual);
        std::cout << quality << std::endl;
      }
    }
  }
}
int main(void)
{
#if 0 // in OP
  { std::ifstream fIn("s2.txt");
    readFromFile(fIn);
  } // fIn goes out of scope -> file is closed
#else // instead
  readFromFile(std::cin);
#endif // 0
  return 0;
}

输入:类似于上述

输出:

ID 1 (string) 
22
22 30
22 30 30
22 30 30 4
22 30 30 4 2
22 30 30 4 2 4
22 30 30 4 2 4 5
22 30 30 4 2 4 5 7
22 30 30 4 2 4 5 7 5
22 30 30 4 2 4 5 7 5 3
22 30 30 4 2 4 5 7 5 3 22
22 30 30 4 2 4 5 7 5 3 22 30
22 30 30 4 2 4 5 7 5 3 22 30 30
22 30 30 4 2 4 5 7 5 3 22 30 30 4
22 30 30 4 2 4 5 7 5 3 22 30 30 4 2
22 30 30 4 2 4 5 7 5 3 22 30 30 4 2 4
22 30 30 4 2 4 5 7 5 3 22 30 30 4 2 4 5
22 30 30 4 2 4 5 7 5 3 22 30 30 4 2 4 5 7
22 30 30 4 2 4 5 7 5 3 22 30 30 4 2 4 5 7 5
22 30 30 4 2 4 5 7 5 3 22 30 30 4 2 4 5 7 5 3
ID 2
30
30 4
30 4 2
30 4 2 1
30 4 2 1 2

iDEONE 的生活演示。