我有一个源文件file1和一个目标文件file2,在这里我必须将内容从 移动 file1到file2.
所以我必须先做一些验证。
我必须检查源文件是否存在?我可以用这个检查:
fp = fopen( argv[1],"r" ); if ( fp == NULL ) { printf( "Could not open source file\n" ); exit(1); }然后我必须检查源文件是否有任何内容?如果它是空的,我必须抛出一些错误信息。
这是我到目前为止所尝试的。
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();
}
看看有没有要读的字符
int c = fgetc(fp);
if (c == EOF) {
/* file empty, error handling */
} else {
ungetc(c, fp);
}
您也可以使用该方法在不打开文件的情况下执行此操作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 代码,但你可以在这里看到它的例子。
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;
打开数据并计算文件的每个字节是很痛苦的。最好要求操作系统为您提供有关您要使用的文件的详细信息。正如 Mike 之前所说,API 依赖于您的操作系统。
您可以检查文件大小是否> 0
在您检查文件的代码存在之后(在您关闭文件之前),您添加以下代码
size = 0
if(fp!=NULL)
{
fseek (fp, 0, SEEK_END);
size = ftell (fp);
rewind(fp);
}
if (size==0)
{
// print your error message here
}