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

C++ 将字符串和数字读取到向量c++;,c++,vector,C++,Vector,当我的文件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) 我想将数字保存到vector,但它不起作用: void readFromFile (){ if

当我的文件
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)
我想将数字保存到vector,但它不起作用:

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();
}
void readFromFile(){
ifstream文件(“s2.txt”);
if(file.good()==true)

cout您应该将每一行读取为一个字符串。然后检查“ID”字符串。如果在一行的位置0处找到“ID”字符串,则将该行读取为ID行,如果没有,则将该行读取为整数行。

您应该将每一行读取为一个字符串。然后检查“ID”字符串。如果“ID”在一行的位置0处找到字符串,然后将该行作为ID行读取,如果没有,则将该行作为整数行读取。

如的答案所示,我制作了相应的示例代码:

#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;
}
输出:

ID1(字符串)
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.
生活演示

注:

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



如果我正确理解了评论,提问者打算在每次迭代中输出整个收集的
质量
向量。因此,我修改了第一个样本,并添加了一个输出
操作符,如的答案中所示,我制作了相应的样本代码:

#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;
}
输出:

ID1(字符串)
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.
生活演示

注:

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



如果我正确理解了注释,提问者打算在每次迭代中输出整个收集的
质量
向量。因此,我修改了第一个示例,并添加了一个输出
操作符。您在每次迭代中都要关闭文件。@mdatsev No,这似乎只是这样。格式化代码后,您会看到,示例是不可压缩的te,但是
file.close()
之外,而
loop.Btw。您甚至不需要
m
std::vector
的最后一个元素可以使用
std::vector::back()
-在您的例子中是
quality.back()
而不是
quality[m]
。此外,您不需要跟踪
std::vector
的长度,因为它也是内置的-
std::vector::size()
while(文件>>qual)
一旦您完成一个数据行并移动到下一行,它就会失败,试图从字符
ID
中生成一个有效的整数,并且失败得很惨。从那里开始,流状态设置为bad,两个循环都失败。因此,跳过以ID开头的一行,一行整数,然后失败,最后终止。可能希望请考虑这一点并考虑跳过的行和数据行的每行处理。从MaNi中记住链接。这很重要。在每次迭代中,您正在关闭文件。@ MDATSEV No,仅此而已。在格式化代码之后,您可以看到,示例不完整,但是<代码>文件。
之外,而
loop.Btw。您甚至不需要
m
std::vector
的最后一个元素可以使用
std::vector::back()
-在您的情况下是
quality.back()
而不是
quality[m]
。此外,您不需要跟踪
std::vector
的长度,因为它也是内置的-
std::vector::size()
while(文件>>qual)
一旦您完成一个数据行并移动到下一行,它就会失败,试图从字符
ID
中生成一个有效的整数,并且失败得很惨。从那里开始,流状态设置为bad,两个循环都失败。因此,跳过以ID开头的一行,一行整数,然后失败,最后终止。可能希望考虑这个问题,考虑跳过的行和数据线的每一行处理,并记住来自Mangi的链接。这很重要。