Проверка на пустой файл в C++
Есть ли простой способ проверить, если файл пуст. Например, если вы передаете файл функции и понимаете, что он пуст, тогда вы закрываете его сразу? Благодарю.
Редактировать, я пытался использовать метод fseek, но я получаю сообщение об ошибке "невозможно преобразовать ifstream в FILE *".
Параметр моей функции
myFunction(ifstream &inFile)
11 ответов
Возможно, что-то сродни
bool is_empty(std::ifstream& pFile)
{
return pFile.peek() == std::ifstream::traits_type::eof();
}
Коротко и сладко.
Что касается вашей ошибки, другие ответы используют доступ к файлам в стиле C, где вы получаете FILE*
с конкретными функциями.
Наоборот, вы и я работаем с потоками C++, и поэтому не можем использовать эти функции. Приведенный выше код работает в простой форме: peek()
заглянет в поток и вернет, не удаляя, следующий символ. Если он достигает конца файла, он возвращает eof()
, Ergo, мы просто peek()
в потоке и посмотреть, если это eof()
, поскольку пустому файлу нечего заглядывать.
Обратите внимание, это также возвращает true, если файл никогда не открывался, что должно работать в вашем случае. Если вы не хотите этого:
std::ifstream file("filename");
if (!file)
{
// file is not open
}
if (is_empty(file))
{
// file is empty
}
// file is open and not empty
Итак, этот кусок кода должен работать для вас. Я изменил имена, чтобы соответствовать вашему параметру.
inFile.seekg(0, ios::end);
if (inFile.tellg() == 0) {
// ...do something with empty file...
}
Найдите в конце файла и проверьте позицию:
fseek(fileDescriptor, 0, SEEK_END);
if (ftell(fileDescriptor) == 0) {
// file is empty...
} else {
// file is not empty, go back to the beginning:
fseek(fileDescriptor, 0, SEEK_SET);
}
Если у вас нет открытого файла, просто используйте fstat
Функция и проверить размер файла напрямую.
Решение C++17 :
#include <filesystem>
const auto filepath = <path to file> (as a std::string or std::filesystem::path)
auto isEmpty = (std::filesystem::file_size(filepath) == 0);
Предполагается, что у вас есть сохраненное местоположение пути к файлу, я не думаю, что вы можете извлечь путь к файлу из
std::ifstream
объект.
Используйте это: data.peek()!= '\0'
Я искал час, пока, наконец, это не помогло!
Если ваш вариант использования предлагает возможность проверки на пустоту перед открытием файла,
C++17 предоставляет вамis_empty
#include <filesystem>
if (!std::filesystem::is_empty("path.txt")) {
///Open and use the file
}
char ch;
FILE *f = fopen("file.txt", "r");
if(fscanf(f,"%c",&ch)==EOF)
{
printf("File is Empty");
}
fclose(f);
когда файл пуст, tellg даст вам значение 0, если он пуст, поэтому сосредоточьтесь на этом, и это самый простой способ найти пустой файл, если вы просто создаете файл, он даст вам -1.
outfile.seekg(0,ios::end);
if(file.tellg()<1){
//empty
}else{
file.clear(); // clear all flags(eof)
file.seekg(0,ios::beg);//reset to front
//not empty
}
Как насчет (не элегантный способ, хотя)
int main( int argc, char* argv[] )
{
std::ifstream file;
file.open("example.txt");
bool isEmpty(true);
std::string line;
while( file >> line )
isEmpty = false;
std::cout << isEmpty << std::endl;
}
if (nfile.eof()) // Prompt data from the Priming read:
nfile >> CODE >> QTY >> PRICE;
else
{
/*used to check that the file is not empty*/
ofile << "empty file!!" << endl;
return 1;
}
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
fseek(pFile, 0, SEEK_SET);
do something...
}
fclose(pFile)