关于C++中 ifstream in 的使用
//f0501.cpp//向量参数传递//=======================================================#include<...
// f0501.cpp
// 向量参数传递
//=======================================================
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
using namespace std;
//-------------------------------------------------------
typedef vector <int> VI;//一维向量
typedef vector <VI> VVI;//二维向量
void print(const VI&);
void input(VVI&);
bool findVec(const VVI&, VI&);
//-------------------------------------------------------
int main()
{
VVI matrix;
input(matrix);
VI vec;
if(findVec(matrix,vec))
print(vec);
}//------------------------------------------------------
void print(const VI& v)
{
for(int i=0; i <v.size(); ++i)
cout < <v[i] < <" ";
cout < <"\n";
}//------------------------------------------------------
void input(VVI& m)
{
ifstream in("abc.txt");
int n,t;
in>>n;
m.resize(n);
for(string s; n-- && getline(in,s); )
{
cout < <n < <" " < <s < <endl;
for(istringstream sin(s); sin>>t; m[m.size()-n-1].push_back(t)) ;
}
}//-------------------------------------------------------
bool findVec(const VVI& matrix, VI& v)
{
for(int i=0; i <matrix.size(); ++i)
for(int j=0; j <matrix[i].size(); ++j)
if(matrix[i][j]==-1)
{
v=matrix[i];
return true;
}
return false;
}//====================================================
不懂的是void input(VVI& m)函数中的ifstream in这几句:
void input(VVI& m)
{
ifstream in("abc.txt");
int n,t;
in>>n;
m.resize(n);
for(string s; n-- && getline(in,s); )
{
cout < <n < <" " < <s < <endl;
for(istringstream sin(s); sin>>t; m[m.size()-n-1].push_back(t)) ;
}
}
in是自定义的吧?可以定义为in,也可以定义为cin等,infstream in("abc.in")括号里的语句可以打开哪些文件呢?包括数组、结构体吗?in>>n;这一句作用是什么?之前百度知道里有回答说是“n 每个向量的元素个数”,但我单独把n输出的时候结果输出的是文件里的第一个数据,怎么会是向量的元素个数?
然后 for(istringstream sin(s); sin>>t; m[m.size()-n-1].push_back(t)) ; 这一句的m[m.size()-n-1]是什么东西?.size()是确定向量元素个数(包括数组吗?),如果前面in>>n;得到的是向量元素个数,那 m.size()-n-1 岂不是 -1?也就是m[-1]?m[m.size()-n-1]到底是怎么确定向量元素的?
本人刚学c++,求各路高手以上问题解释。 展开
// 向量参数传递
//=======================================================
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
using namespace std;
//-------------------------------------------------------
typedef vector <int> VI;//一维向量
typedef vector <VI> VVI;//二维向量
void print(const VI&);
void input(VVI&);
bool findVec(const VVI&, VI&);
//-------------------------------------------------------
int main()
{
VVI matrix;
input(matrix);
VI vec;
if(findVec(matrix,vec))
print(vec);
}//------------------------------------------------------
void print(const VI& v)
{
for(int i=0; i <v.size(); ++i)
cout < <v[i] < <" ";
cout < <"\n";
}//------------------------------------------------------
void input(VVI& m)
{
ifstream in("abc.txt");
int n,t;
in>>n;
m.resize(n);
for(string s; n-- && getline(in,s); )
{
cout < <n < <" " < <s < <endl;
for(istringstream sin(s); sin>>t; m[m.size()-n-1].push_back(t)) ;
}
}//-------------------------------------------------------
bool findVec(const VVI& matrix, VI& v)
{
for(int i=0; i <matrix.size(); ++i)
for(int j=0; j <matrix[i].size(); ++j)
if(matrix[i][j]==-1)
{
v=matrix[i];
return true;
}
return false;
}//====================================================
不懂的是void input(VVI& m)函数中的ifstream in这几句:
void input(VVI& m)
{
ifstream in("abc.txt");
int n,t;
in>>n;
m.resize(n);
for(string s; n-- && getline(in,s); )
{
cout < <n < <" " < <s < <endl;
for(istringstream sin(s); sin>>t; m[m.size()-n-1].push_back(t)) ;
}
}
in是自定义的吧?可以定义为in,也可以定义为cin等,infstream in("abc.in")括号里的语句可以打开哪些文件呢?包括数组、结构体吗?in>>n;这一句作用是什么?之前百度知道里有回答说是“n 每个向量的元素个数”,但我单独把n输出的时候结果输出的是文件里的第一个数据,怎么会是向量的元素个数?
然后 for(istringstream sin(s); sin>>t; m[m.size()-n-1].push_back(t)) ; 这一句的m[m.size()-n-1]是什么东西?.size()是确定向量元素个数(包括数组吗?),如果前面in>>n;得到的是向量元素个数,那 m.size()-n-1 岂不是 -1?也就是m[-1]?m[m.size()-n-1]到底是怎么确定向量元素的?
本人刚学c++,求各路高手以上问题解释。 展开
1个回答
展开全部
〉in是自定义的吧?可以定义为in,也可以定义为cin等
--是的。
〉ifstream in("abc.in")括号里的语句可以打开哪些文件呢?包括数组、结构体吗?
--最好只用它来读含有文字的文件。倒不是说二进制文件不能用它读,而是因为ifstream本意就是为了读取字符设计的,用它来读二进制文件再作转换反而低效率。你说的数组、结构体如果是写在二进制文件里面的,最好别。
〉in>>n;这一句作用是什么?
-- 把文件最开始的部分作为整数读出来,写入整数n。
〉.size()是确定向量元素个数(包括数组吗?)
--是的。
〉如果前面in>>n;得到的是向量元素个数,那 m.size()-n-1 岂不是 -1?
注意这个语句是在一个大循环里面:
for(string s; n-- && getline(in,s); )
n是在不断递减的,每次减一。所以m.size()-n-1在这个循环里不停地增加,从0到m.size()-1。
--是的。
〉ifstream in("abc.in")括号里的语句可以打开哪些文件呢?包括数组、结构体吗?
--最好只用它来读含有文字的文件。倒不是说二进制文件不能用它读,而是因为ifstream本意就是为了读取字符设计的,用它来读二进制文件再作转换反而低效率。你说的数组、结构体如果是写在二进制文件里面的,最好别。
〉in>>n;这一句作用是什么?
-- 把文件最开始的部分作为整数读出来,写入整数n。
〉.size()是确定向量元素个数(包括数组吗?)
--是的。
〉如果前面in>>n;得到的是向量元素个数,那 m.size()-n-1 岂不是 -1?
注意这个语句是在一个大循环里面:
for(string s; n-- && getline(in,s); )
n是在不断递减的,每次减一。所以m.size()-n-1在这个循环里不停地增加,从0到m.size()-1。
追问
从程序来看in>>n;这句的作用是得到向量的元素个数,之前百度知道里也确有回答说“n是向量元素个数”,我想不明白的是从文件中读入第1个数据又是怎么确定向量元素个数的?为什么把从文件中读入的第1个数据作为向量元素的个数?。。。还是我理解错了?
追答
你的理解是正确的,第一个数据确实就是向量元素个数。但是你要注意这里的m是个二维向量,它的每个元素都是另一个向量。所以这里应该这么理解——n是m的行数。
这个文件在存储时一定是遵循了某种格式的。从代码可以看出来,大概是这样——第1行,总行数n;第2到第n+1行,每一行里面都有若干数据,将分别读入m[0]到m[n-1]里面。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询