редактировать: проблема проверки, если файл пуст или нет, что я делаю не так?

Изменить: изменил мой вопрос, чтобы быть более точным в ситуации

Я пытаюсь открыть текстовый файл (создайте его, если он не существует, откройте его, если он не существует). Это тот же входной файл, что и вывод.

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, который обычно запрашивает у меня новую цель. Я не могу понять, что здесь происходит.

-3

Решение

Проблема просто в том, что вы используете буферизованные потоки ввода-вывода. Несмотря на то, что они ссылаются на один и тот же файл внизу, они имеют совершенно разные буферы.

// 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";

На этом этапе «привет», возможно, не был записан на диск, единственная гарантия, что он находится в выходном буфере 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 во входном потоке каждый раз, когда в файл записывается больше данных …

1

Другие решения

Пытаться Повышение :: FileSystem :: IS_EMPTY какой тест, если ваш файл пуст. Я где-то читал, что использование fstream не является хорошим способом проверки пустых файлов.

1

По вопросам рекламы [email protected]