Как проверить, содержит ли файл содержимое или нет с помощью c?
У меня есть исходный файл file1
и файл назначения file2
здесь я должен переместить контент из file1
в file2
,
Поэтому сначала я должен сделать некоторую проверку.
Я должен проверить, существует ли исходный файл или нет? Я могу проверить, используя это:
fp = fopen( argv[1],"r" ); if ( fp == NULL ) { printf( "Could not open sourse file\n" ); exit(1); }
Тогда я должен проверить исходный файл есть содержание или нет? Если там пусто, надо скинуть какую-нибудь ошибку.
Это то, что я пробовал до настоящего момента.
8 ответов
C версия:
if (NULL != fp) {
fseek (fp, 0, SEEK_END);
size = ftell(fp);
if (0 == size) {
printf("file is empty\n");
}
}
Версия C++ (украдена отсюда):
bool is_empty(std::ifstream& pFile)
{
return pFile.peek() == std::ifstream::traits_type::eof();
}
Вы можете сделать это, не открывая файл, также используя stat
метод.
#include <sys/stat.h>
#include <errno.h>
int main(int argc, char *argv[])
{
struct stat stat_record;
if(stat(argv[1], &stat_record))
printf("%s", strerror(errno));
else if(stat_record.st_size <= 1)
printf("File is empty\n");
else {
// File is present and has data so do stuff...
}
Так что если файл не существует, вы нажмете первый if
и получите сообщение как: "No such file or directory"
Если файл существует и пуст, вы получите второе сообщение "File is empty"
Эта функциональность существует как в Linux, так и в Windows, но на Win это _stat
, Я еще не тестировал код Windows, но вы можете увидеть его примеры здесь.
Просто посмотрите, есть ли персонаж для чтения
int c = fgetc(fp);
if (c == EOF) {
/* file empty, error handling */
} else {
ungetc(c, fp);
}
fseek(fp, 0, SEEK_END); // goto end of file
if (ftell(fp) == 0)
{
//file empty
}
fseek(fp, 0, SEEK_SET); // goto begin of file
// etc;
Вы можете использовать feof()
функция. пример:
if(feof(file))
{
printf("empty file\n");
}
Вы можете проверить, если размер файла> 0
после того, как ваш код проверки файла существует (перед закрытием файла), вы добавляете следующий код
size = 0
if(fp!=NULL)
{
fseek (fp, 0, SEEK_END);
size = ftell (fp);
rewind(fp);
}
if (size==0)
{
// print your error message here
}
Больно открывать данные и считать каждый байт файла. Лучше попросить операционную систему предоставить вам подробную информацию о файлах, которые вы хотите использовать. API зависит от вашей операционной системы, как ранее говорил Майк.