编辑:麻烦检查文件是否为空,我做错了什么?

时间:2016-03-06 03:57:05

标签: c++ fileinputstream

编辑:改变我的问题以更准确地了解情况

我正在尝试打开一个文本文件(如果它不存在则创建它,如果它不存在则打开它)。它与输出的输入文件相同。

ofstream oFile("goalsFile.txt");
fstream iFile("goalsFile.txt");
string goalsText;   
string tempBuffer;
//int fileLength = 0;
bool empty = false;

if (oFile.is_open())
{
    if (iFile.is_open())
    {
        iFile >> tempBuffer;
        iFile.seekg(0, iFile.end);
        size_t fileLength = iFile.tellg();
        iFile.seekg(0, iFile.beg);
        if (fileLength == 0) 
        {
            cout << "Set a new goal\n" << "Goal Name:"; //if I end debugging her the file ends up being empty
            getline(cin, goalSet);
            oFile << goalSet;
            oFile << ";";
            cout << endl;

            cout << "Goal Cost:";
            getline(cin, tempBuffer);
            goalCost = stoi(tempBuffer);
            oFile << goalCost;
            cout << endl;
        }
    }
}

一些问题。首先,如果文件存在且文本中包含文本,它仍会进入if循环,通常会要求我设置新目标。我似乎无法弄清楚这里发生了什么。

2 个答案:

答案 0 :(得分:1)

尝试Boost::FileSystem::is_empty测试您的文件是否为空。我在某处读到使用fstream不是测试空文件的好方法。

答案 1 :(得分:1)

问题在于您使用的是缓冲IO流。尽管它们引用了下面的相同文件,但它们具有完全独立的缓冲区。

// open the file for writing and erase existing contents.
std::ostream out(filename);
// open the now empty file for reading.
std::istream in(filename);
// write to out's buffer
out << "hello";

此时,&#34;你好&#34;可能没有写入磁盘,唯一的保证是它在out的输出缓冲区中。要强制将其写入磁盘,您可以使用

out << std::endl;  // new line + flush
out << std::flush; // just a flush

这意味着我们已将输出提交到磁盘,但此时输入缓冲区仍未触及,因此文件仍然显示为空。

为了让您的输入文件能够看到您写入输出文件的内容,您需要使用sync

#include <iostream>
#include <fstream>
#include <string>

static const char* filename = "testfile.txt";

int main()
{
    std::string hello;

    {
        std::ofstream out(filename);
        std::ifstream in(filename);
        out << "hello\n";
        in >> hello;
        std::cout << "unsync'd read got '" << hello << "'\n";
    }

    {
        std::ofstream out(filename);
        std::ifstream in(filename);
        out << "hello\n";

        out << std::flush;
        in.sync();

        in >> hello;
        std::cout << "sync'd read got '" << hello << "'\n";
    }
}

您尝试使用缓冲流执行此操作时遇到的下一个问题是,每次有更多数据写入文件时,需要clear()输入流上的eof位...