我正在学习我正在进行的项目的文件I / O.使用seekg()和tellg()对我来说是必要的,所以我开始研究。在对我的代码进行故障排除时(因为文件没有按照我想要的方式读取数据),我测试了以下代码:
fileObj.seekg(fileObj.tellg(),std::ios::beg);
但是,这会导致无休止的循环。此代码在某个位置将导致无限循环,但其他两个相同的行在其他区域无效。 tellg()应该是当前位置,因此将当前位置更改为当前位置不应该有任何影响。但事实显然并非如此,我想了解为什么我可以更有效地使用tellg()和seekg()。
std::unordered_map <unsigned, Player> genRoster(String rosterFile)
{
std::ifstream fileObj;
fileObj.open(rosterFile.c_str(), std::ios::in);
if (!fileObj.is_open())
{
std::cerr << "rosterFile could not be opened." << std::endl;
exit(EXIT_FAILURE);
}
String teamName;
teamName.getLine(fileObj,'\n',0);
//skip the # of players line
long long fileLocation;
if(fileObj.tellg() != -1)
fileLocation = fileObj.tellg() + 1;
fileObj.seekg(fileLocation);
std::unordered_map <unsigned, Player> roster;
while(!fileObj.eof())
{
fileObj.seekg(fileObj.tellg(),std::ios::beg); //no effect
unsigned ID;
fileObj.seekg(fileObj.tellg(),std::ios::beg); //no effect
String playerName;
fileObj >> ID >> playerName;
//fileObj.seekg(fileObj.tellg(),std::ios::beg); //endless loop!
std::cout << "ID: " << ID << std::endl;
std::cout << "name: " << playerName << std::endl;
std::cout << "team: " << teamName << std::endl;
//Player player(ID, playerName, teamName);
//roster.emplace(ID, player);
// ...
//The rest of the code is incomplete / irrelevant
}
return roster;
}
这是我正在阅读的文件:
The Cowboys
3
1 Bob
2 Sally
3 Sam
我正在使用自己的字符串类,以防万一重载&gt;&gt;运算符是问题的一部分,这里是实现:
std::istream& operator>>(std::istream& input, String& inputVar)
{
inputVar.stringLen = 0;
inputVar.stringVar = new char[inputVar.stringLen + 1];
inputVar.stringVar[inputVar.stringLen] = '\0';
long long lenCounter = 0;
char inputChar;
while (input.get(inputChar))
{
// end-of-input delimiter (change according to your needs)
if (inputChar == '\n') break;
// if buffer is exhausted, reallocate it twice as large
if (lenCounter == inputVar.stringLen)
{
//this is needed for me bc i chose stringlen to be w/o null term.
//so starts at 0. so *2 would do nothing
if (inputVar.stringLen == 0) inputVar.stringLen++;
inputVar.stringLen *= 2;
char *newString = new char[inputVar.stringLen];
strcpy(newString, inputVar.stringVar);
delete[] inputVar.stringVar;
inputVar.stringVar = newString;
}
// store input char
inputVar.stringVar[lenCounter] = inputChar;
lenCounter++;
}
inputVar.stringVar[lenCounter] = '\0';
return input;
}
请原谅任何礼仪后的错误。让我知道,我会编辑。我一直在阅读Stack Overflow,但这是我的第一篇文章。
谢谢。