Как проверить в с++ пуст файл или нет?
Добрый день! Мне нужно написать программу, которая после открытия файла будет делать проверку, пуст этот файл или нет. Подскажите, пожалуйста, как это можно сделать на с++?
#include #include int main(int argc, char* argv[]) < std::ifstream file( "example.txt", std::ios::binary | std::ios::ate); // Вывод размера файла std::cout
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Проверка файла на пустоту
Проблема такая: нужно сделать проверку файла на существование и на непустоту. Сейчас пока сделал проверку с помощью fopen, но это как то криво помоему(проверка на пустоту не реализована вообще пока).
В идеале требуется какая нить функция, которая в случае если файл содержит какую нить инфу, возвращала не ноль, а в случае если файла не существует, или он пуст - возвращала NULL. Есть ли что то подобное?
13 ответов
03 мая 2007 года
14 / / 23.04.2007
WIN32_FIND_DATA Data;
HANDLE hFile = FindFirstFile("MyFile.bin",&Data);
if (hFile)
DWORD size;
GetFileSize(hFile,&size);
>
04 мая 2007 года
816 / / 16.12.2004
Проблема такая: нужно сделать проверку файла на существование и на непустоту. Сейчас пока сделал проверку с помощью fopen, но это как то криво помоему(проверка на пустоту не реализована вообще пока).
В идеале требуется какая нить функция, которая в случае если файл содержит какую нить инфу, возвращала не ноль, а в случае если файла не существует, или он пуст - возвращала NULL. Есть ли что то подобное?
А чем не устраивает-то?:
bool IfFileExistsAndIsNotEmpty( AnsiString fPath )
char str[255];
ifstream file_re;
file_re.open( fPath.c_str() );
if ( ! file_re )
return false;
>
while ( ! file_re.getline( str, sizeof(str) ).eof() )
return true;
>
04 мая 2007 года
33 / / 15.01.2007
WIN32_FIND_DATA Data;
HANDLE hFile = FindFirstFile("MyFile.bin",&Data);
if (hFile)
DWORD size;
GetFileSize(hFile,&size);
>
У меня почему то GetFileSize получает какие то страшные числа, причём каждый раз - разные для одного и того же файла. Даже для пустого.
05 мая 2007 года
139 / / 19.02.2006
Можно все сделать по простому считать из файла значения в какую нить переменную а потом if perem = ' ' пустой файл
05 мая 2007 года
1.4K / / 09.04.2004
а ты точно значение переменной смотришь, а не указателя?? по-моему эта функция глючить не должна ;)
06 мая 2007 года
456 / / 07.03.2004
Ну раз уж проблема с GetFileSize.
FILE *f = fopen(filename, "r");
fseek(f, 0, SEEK_END);
unsigned int size = ftell(f);
07 мая 2007 года
33 / / 15.01.2007
а ты точно значение переменной смотришь, а не указателя?? по-моему эта функция глючить не должна ;)
Можете сами проверить.
WIN32_FIND_DATA Data;
HANDLE hFile = FindFirstFile("C:\\001.txt",&Data);
if(hFile == INVALID_HANDLE_VALUE)
printf("INVALID HANDLE\n");
else
DWORD size;
Вывел результат:
size: -858993460
07 мая 2007 года
4.8K / / 20.01.2000
Для mathers и Kortar:
Я настоятельно рекомендую почитать описание функции GetFileSize в MSDN.
Там всё предельно ясно сказано.
08 мая 2007 года
33 / / 15.01.2007
Для mathers и Kortar:
Я настоятельно рекомендую почитать описание функции GetFileSize в MSDN.
Там всё предельно ясно сказано.
Я читал. Вроде бы всё правильно.
Может расскажешь, в чём подвох?
08 мая 2007 года
1.4K / / 09.04.2004
lpFileSizeHigh
[out] Pointer to the variable where the high-order word of the file size is returned. This parameter can be NULL if the application does not require the high-order word.
ключевое слово high-order word. То-есть если у тебя файл меньше 4гиг, то нужно так:
printf("size: %d\n",GetFileSize(hFile,&size));
если файл больше то тогда твой размер будет вычисляться по формуле:
GetFileSize(hFile,&size) + size * 2^32.
так вы мсдн читаете, товарищи.. ))
08 мая 2007 года
33 / / 15.01.2007
ключевое слово high-order word. То-есть если у тебя файл меньше 4гиг, то нужно так:
printf("size: %d\n",GetFileSize(hFile,&size));
если файл больше то тогда твой размер будет вычисляться по формуле:
GetFileSize(hFile,&size) + size * 2^32.
так вы мсдн читаете, товарищи.. ))
Хмм. Помоему здесь функция размер не возвращает? А пишет его в size. Так что сия строчка мне не понятна :)
printf("size: %d\n",GetFileSize(hFile,&size));
В любом случае, если делать так, как ты написал - всегда выдаётся "-1"
08 мая 2007 года
4.8K / / 20.01.2000
Хмм. Помоему здесь функция размер не возвращает? А пишет его в size. Так что сия строчка мне не понятна :)
Ещё раз настоятельно рекомендую читать MSDN, а не придумывать самому, что куда возвращается.
[QUOTE=MSDN]
If the function succeeds, the return value is the low-order doubleword of the file size
[/QUOTE]
Кроме того, как уже сказал Dart Bobr, если файл заведомо меньше 4Гб, то второй аргумент вообще не нужен можем передавать NULL:
DWORD size = GetFileSize(hFile, NULL);
printf("size: %d\n",GetFileSize(hFile,&size));
В любом случае, если делать так, как ты написал - всегда выдаётся "-1"
А что такое -1 ?
Читаем MSDN!
[QUOTE=MSDN]
If the function fails and lpFileSizeHigh is NULL, the return value is INVALID_FILE_SIZE. To get extended error information, call GetLastError.
[/QUOTE]
Пробовал получить информацию об ошибке? Попробуй.
Код ошибки будет 6, т.е. "The handle is invalid."
Ой, а что же у нас с хендлом? А как мы его получили?
С помощью функции FindFirstFile. Читаем в MSDN об этой фукнкции:
[QUOTE=MSDN]
If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose.
[/QUOTE]
Написано, что мы можем использовать полученный т.о. хендл для GetFileSize? НЕТ.
А как же нам получить нужный хендл?
Читаем в MSDN какой же хендл надо передавать в GetFileSize:
[QUOTE=MSDN]
hFile
[in] Handle to the file whose size is to be returned. This handle must have been created with either the GENERIC_READ or GENERIC_WRITE access right. For more information, see File Security and Access Rights.
[/QUOTE]
Если подумать логически или тыкнуть на ссылку "File Security and Access Rights", то обнаружится, что соотв. хендл для файла можно получить вызовом функции CreateFile.
Т.о. мы приходим к коду:
HANDLE hFile = CreateFile("C:\\001.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_FILE_SIZE == hFile) ---- ERROR ----
>
DWORD size = GetFileSize(hFile, NULL);
Так что НАСТОЯТЕЛЬНО рекомендую читать MSDN и пытаться думать.
Проверка текстового файла на пустоту
В случае, когда файл пуст, программа всё равно не считает его пустым. Почему это происходит? Как это исправить? Может быть, существует какая-то другая, более эффективная проверка?
1 2 3 4 5
g = fopen("Program.txt", "r"); if (feof(g)) { fprintf(f, "%s", "Файл с программой пуст!"); };
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Проверка файла на пустоту
очень важный для меня вопрос. как проверить файл на пустоту. мне нужно будет если файл выполнять.
Проверка файла на пустоту
Здравствуйте, нужно сделать проверку на пустоту, если файл пуст то идет одна ветка,если не пуст.
Проверка файла на пустоту
void Add_New_User() < FILE *Fptr = fopen("New_User.txt", "r"); if ((Fptr =.

Проверка на пустоту файла С++
Помогите реализовать проверку на наличие файла и его пустоту. Если файл не открывается, вывести.
![]()
13310 / 10618 / 6343
Регистрация: 18.12.2011
Сообщений: 28,346

Сообщение было отмечено NoviiMir как решение
Решение
fopen - только открывает файл.
Чтобы проверить на наличие данных надо перейти в конец
и прочитать позицию:
1 2 3 4 5 6 7 8
fseek(g,0,SEEK_END); long pos=ftell(g); if(pos>0) { // файл непустой. rewind(g); . }
![]()
27697 / 17314 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
NoviiMir, feof дает истину, когда происходила попытка чтения за пределами файла. У вас же такой попытки не было.
![]()
13310 / 10618 / 6343
Регистрация: 18.12.2011
Сообщений: 28,346
Я проверил для пустого файла pos получается равно 2, пишем:
1 2 3 4 5 6
if(pos>2) { // файл непустой. rewind(g); . }
Проверьте, пуст ли файл в C#.
В этом посте будет обсуждаться, как проверить, пуст ли файл в C#.
Вы можете определить, является ли файл пустым или нет, используя возвращаемое значение FileInfo.Длина имущество. FileInfo.Length Свойство возвращает размер текущего файла в байтах. Если указанный файл пуст, возвращается 0 байт.
using System ;
using System . IO ;
public class Example
public static void Main ( )
string path = @"C:\data.txt" ;
var f = new FileInfo ( path ) ;
if ( f . Length == 0 ) <
Console . WriteLine ( "The file <0>is empty" , f . Name ) ;0>
Console . WriteLine ( "The file <0>is not empty" , f . Name ) ;0>
Если указанный файл не существует, System.IO.FileNotFoundException Поднялся. Вы можете избежать исключения, проверив, существует ли файл, прежде чем работать с ним, используя FileInfo.Exists имущество.
using System ;
using System . IO ;
public class Example
public static void Main ( )
string path = @"C:\data.txt" ;
var f = new FileInfo ( path ) ;
if ( ! f . Exists ) <
Console . WriteLine ( "The file <0>does not exist" , f . Name ) ;0>
else if ( f . Length == 0 ) <
Console . WriteLine ( "The file <0>is empty" , f . Name ) ;0>
Console . WriteLine ( "The file <0>is not empty" , f . Name ) ;0>
Обратите внимание, что FileInfo.Length Метод может возвращать ненулевую длину в некоторых случаях, когда в файле остается только символ метки порядка байтов (BOM). Вы можете добавить последующие проверки, чтобы избежать риска недетерминированного поведения позже. Идея состоит в том, чтобы прочитать содержимое файла в строку, используя File.ReadAllText() метод и проверьте длину строки. Поскольку File.ReadAllText() метод считывает весь текст в файле в строку, вы должны вызывать этот метод только в том случае, если размер, возвращаемый FileInfo.Length свойство однозначное. Следующий пример иллюстрирует.
