理解seekg()和tellg()

时间:2017-06-03 02:30:07

标签: c++ file-io

我正在学习我正在进行的项目的文件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,但这是我的第一篇文章。

谢谢。

0 个答案:

没有答案