使用tellg()确定文件的长度,最终结果为-1

时间:2014-11-09 22:57:50

标签: c++ io fstream eof

我试图通过一个长度来查找文件的长度,该长度增加1直到达到文件的末尾。它确实转到文件的末尾,然后读取EOF,好像它是另一个值,导致它变为-1。我无法弄清楚如何阻止这种情况发生并获得文件的实际长度。任何帮助,将不胜感激!

我的代码,目前:

#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;
void input(ofstream&,string &InputStr);
void ErrChek(ifstream&,long&,char&);

int main(int argc, const char * argv[])
{

    char file2[] = "file2.txt";

    ofstream OutFile;
    ifstream InpFile;
    string InputStr;
    char Read;
    int Choice = 0;
    long Last = 0;
    OutFile.open(file2);

    if(OutFile.fail())
    {
        cout << "file named can not be found \n";
        exit(1);
    }
    input(OutFile,InputStr);
    OutFile.close();
    InpFile.open(file2);
    cout << InpFile.tellg() << endl;
    if(InpFile.fail())
    {
        cout << "file named can not be found \n";
        exit(1);
    }
    ErrChek(InpFile,Last,Read);
    InpFile.close();

    return 0;
}

void input(ofstream &OutFile,string &InputStr) //Gets input from user + writes to file
{
    cout << "Please input 1 sentence for use in the file: ";
    getline(cin,InputStr);
    OutFile << InputStr;
}

void ErrChek(ifstream &InpFile,long &Last,char &Read)
{
    while((Last = InpFile.tellg())!=EOF)
    {
        InpFile.seekg(Last,ios::beg);
        InpFile.get();
        Last = InpFile.tellg();
        cout << InpFile.tellg() << endl;
    }
}

输出:

Please input 1 sentence for use in the file: Test Sentence
0
1
2
3
4
5
6
7
8
9
10
11
12
13
-1

3 个答案:

答案 0 :(得分:1)

tellg返回当前字符的位置。如果失败,则返回-1。按照您的示例,您可以在迭代流中增加变量或使用@ NeilKirk的link

中描述的更简单的方法

答案 1 :(得分:1)

你的逻辑有点偏。 tellg()在文件末尾的 get()之后返回EOF之前不会返回EOF。请注意,get()会更改文件位置,但在读取之前您的循环条件为tellg(),而之后再次再次调用 阅读期望它与阅读前一样 - 但它不会成功。

除此之外还有更清晰的方法可以做到这一点,如果你想用你的方法做到这一点,你的逻辑将是这样的(有点伪代码):

tellg()

请注意,您的Last = 0; while(InpFile.get()!=EOF) { Last = InpFile.tellg(); } cout << Last << endl; 是不必要的,因为它将文件指针放在它已经存在的位置,并且我已将其删除以简化。

上面示例中的关键是您在阅读后获取文件位置,但在您点击EOF时不要覆盖seekg()。我们检查 get 返回的EOF状态,而不是 tellg

想象一个小的2或3字节文件,并在头脑或纸上完成原始代码,以更清楚地了解逻辑问题。

答案 2 :(得分:0)

也许这不是你想要的答案,但为什么不使用stat()呢? 见How do you determine the size of a file in C?

关于你的代码,你必须在分配EOF(EOF = -1)之前输出tellg()值

void ErrChek(ifstream &InpFile,long &Last,char &Read)
{
    while((Last = InpFile.tellg())!=EOF)
    {
        cout << Last << endl;
        InpFile.seekg(Last,ios::beg);
        InpFile.get();
    }
}