将字符串和数字读取到向量C
read string and numbers to vector c++
当我的文件 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
开头。如果不是,则buffer
与std::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 的生活演示。
相关文章:
- C++:如何读取分离变量,然后读取向量
- C++读取行到类向量
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 从流到邻接列表的向量读取图形
- 尝试将字符串从文件读取到无符号字符向量中
- 如何在 c++ 中从字符串向量中读取
- 将结构向量保存到文件中,并从C++文件中读取结构向量
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 从.txt文件读取到C++中的双精度向量
- 用rapidjson读取子对象向量
- 对唯一 ptr 无效读取的引用向量
- 如何从输入文件中读取字符并将其存储到向量中?
- 如何使用 cin 将整数从控制台读取到向量中
- 通过将文本文件读取为字符串/向量来计算加权/未加权 GPA
- 以C++为单位将已知数量的整数输入正确读取到向量中
- C 从文件到向量读取
- 使用向量读取输入文件
- 在 TheADS 中的向量读取之间插入元素
- 从向量读取并分配给对象的成员
- 从保留的向量读取比从非保留向量读取更快