有人可以告诉我为什么对以下变量所做的更改没有被引入主?
我对此很陌生,所以请保持简单。
如果您需要更多我的代码,请告诉我:D
void BannedWordsArrayCreate (string filePathInBanned, vector<string> bannedWords, vector<int> bannedWordsCount, vector<int> containsBannedWordsCount ) {
cout << "Please enter the file path for the banned word list. (no extension.): " << endl; //User enters file name
cout << "E.g. C:\\Users\\John\\banned" << endl;
cin >> filePathInBanned;
filePathInBanned += ".txt"; //Takes User defined file name and adds .txt
ifstream inFile;
inFile.open(filePathInBanned,ios::in); //opens file
if (!inFile) //if file cannot be opened: exits function.
{
cerr << "Can't open input file." << filePathInBanned << endl;
exit(1);
}
else if (inFile.is_open()) //if file opens: puts file into vector.
{
string bw = "nothing"; //temporary string used to signal end of file.
while(!inFile.eof() && bw != "")
{
inFile >> bw;
if (bw != "")
{
bannedWords.push_back(bw);
}
}
}
inFile.close();
cout << endl << "Done!" << endl << endl;
for(int i = 0; i < bannedWords.size(); i++)
{
bannedWordsCount.push_back(0);
containsBannedWordsCount.push_back(0);
}
}
答案 0 :(得分:2)
这一行...
void BannedWordsArrayCreate (string filePathInBanned,
vector<string> bannedWords, vector<int> bannedWordsCount,
vector<int> containsBannedWordsCount )
...需要通过引用 (使用&
令牌)询问变量 ...
void BannedWordsArrayCreate (string& filePathInBanned,
vector<string>& bannedWords, vector<int>& bannedWordsCount,
vector<int>& containsBannedWordsCount )
引用基本上是原始变量的别名或替代名称(由调用者提供),因此“对引用”所做的更改实际上是修改原始变量。
在原始函数中,函数参数通过值 传递 ,这意味着复制了调用上下文中的变量,并且该函数只能在那些函数上工作副本 - 函数返回时,对副本的任何修改都将丢失。
另外,!inFile.eof()
未正确使用。关于这个问题有很多Stack Overflow Q / A,但是简单地说eof()
标志只能在它知道你想要转换的内容之后由流设置(例如,如果你试图读入一个字符串,它只能找到很多空格,然后它会失败并设置eof
,但是如果你向流询问下一个字符是什么(包括空格)那么它会成功返回该字符而不会命中/设置EOF)。您可以将输入处理简化为:
if (!(std::cin >> filePathInBanned))
{
std::cerr << "you didn't provide a path, goodbye" << std::endl;
exit(1);
}
filePathInBanned += ".txt"; //Takes User defined file name and adds .txt
if (ifstream inFile(filePathInBanned))
{
string bw;
while (inFile >> bw)
bannedWords.push_back(bw);
// ifstream automatically closed at end of {} scope
}
else
{
std::cerr << "Can't open input file." << filePathInBanned << std::endl;
exit(1);
}
答案 1 :(得分:1)
您的所有参数都按值传递。这意味着当您调用该函数时,将复制您传入的对象。因此,当它们在函数内部被更改时,更改将在副本上执行,而不是您传入的原始文件。要解决此问题,请通过引用传递:
void BannedWordsArrayCreate (string& filePathInBanned, vector<string>& bannedWords, vector<int>& bannedWordsCount, vector<int>& containsBannedWordsCount )
&安培;在对象类型之后说我们要将内存地址复制到函数而不是对象。因此,当我们对函数内部的对象进行更改时,我们正在更改传入的地址处的内存。原始文件已更改。