我试图在读取文件时返回值(即行和列),因为我将读取多个文件并从每个文件中获取相同的变量,我认为编写函数而不是复制更好并粘贴重复的代码.
无论如何,我试图返回2个值并使用它们,请参阅下面的代码:
#include <iostream>
#include <fstream>
using namespace std;
int r(string fn);
int main()
{
int a, b = r("input_a.txt");
cout << "a --- " << a << endl;
cout << "b --- " << b << endl;
}
int r(string fn)
{
ifstream fin01;
string file = fn;
fin01.open(file.c_str());
...
...
...
// Suppose I should be getting 2 for 'rows' and 3 for 'cols'
return rows, cols;
}
Run Code Online (Sandbox Code Playgroud)
我0x7fff670778ec和0x7fff670778e8我的输出,而不是...
有什么指针吗?
您不能从声明为具有int返回类型的函数返回两个值:
int r(string fn){
/*...*/
return rows,cols; // <-- this is not correct
}
Run Code Online (Sandbox Code Playgroud)
您调用此函数的方式也不像您预期的那样:
int a, b = r("input_a.txt");
Run Code Online (Sandbox Code Playgroud)
这声明了两个整数并用函数的返回值初始化第二个整数,但第一个保持未初始化(有关逗号运算符的更多解释,请参阅TerraPass答案).
你基本上有两个选择.第一个选项是传递对函数的引用,函数将结果分配给这些引用:
void r(string fn, int& rows,int& cols) {
/*...*/
rows = x;
cols = y;
}
Run Code Online (Sandbox Code Playgroud)
你这样称呼它:
int a,b;
r("someString",a,b);
Run Code Online (Sandbox Code Playgroud)
但是,通过这种方式,调用者必须"准备"那些返回值.Imho使用返回值返回函数的结果更方便(听起来合乎逻辑,没有?).要做到这一点,你只需要定义一个封装两个整数的类型:
struct RowAndCol { int row;int col; };
RowAndCol r(string fn) {
/*...*/
RowAndCol result;
result.row = x;
result.col = y;
return result;
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
RowAndCol rc = r("someString");
Run Code Online (Sandbox Code Playgroud)
请注意,您也可以使用a std::pair<int,int>而不是定义自定义结构(请参阅例如molbdnilos answer).但是,恕我直言,只要你确切地知道对中包含的内容,最好给它一个合理的名称(例如RowAndCol),而不是使用裸体std::pair<int,int>.这也可以帮助您以后需要向结构添加更多方法(例如,您可能希望重载std::ostream& operator<<结构以在屏幕上打印它).
PS:实际上你的输出看起来不像是你所展示的代码产生的.这些是一些内存地址,但在您的代码中既没有指针也没有地址操作符.