文件大小总是在变化,使用 C 和 fopen_s 函数
Posted
技术标签:
【中文标题】文件大小总是在变化,使用 C 和 fopen_s 函数【英文标题】:file size is always changing , using C and fopen_s function 【发布时间】:2012-10-25 09:09:37 【问题描述】:这个基本函数是我写的:
int save_files(PCHAR fileName)
errno_t err;
FILE* pFile = NULL;
do
if (!fileName)
printf("Input is NULL \n");
break;
err = fopen_s( &pFile, fileName, "r");
if(0 != err)
printf("The file %s was not opened for reading\n", fileName);
else
printf("The file %s was opened for reading \n", fileName);
/*getting the fileSize */
fileSize = dbg_getFileSize(pFile);
printf("############# FILE SIZE IS : %d #############\n" );
这是获取文件大小的函数:
UINT32 dbg_getFileSize(FILE *file)
UINT32 size = 0 ;
if (file == NULL)
return -1;
fseek(file , 0L , SEEK_END);
size = ftell(file);
fseek(file, 0L, SEEK_SET);/*set it to the head!!! */
return size;
我总是打开相同的路径,每次都得到不同的大小 我尝试用 "r" 和 "rb" 打开它,但仍然得到相同的不同数字..
【问题讨论】:
【参考方案1】:您会得到不同的文件大小,因为以下行:
printf("############# FILE SIZE IS : %d #############\n" );
实际上并没有指定您要打印的变量。因此,当你调用它时,它可能会得到堆栈上的任何垃圾(我说可能,但是 任何事情 都可能发生,因为你已经调用了可怕的“未定义行为”(a)支持>)。
你可能想试试这个:
printf("############# FILE SIZE IS : %d #############\n", fileSize );
(a) 来自C99 7.19.6.1 The fprintf function
,在C11 7.20.6.1
中不变,等效部分:
fprintf函数将输出写入stream指向的流,受控制 format 所指向的字符串的名称,该格式指定后续参数的方式 转换为输出。 如果格式的参数不足,则行为是 未定义。 如果格式已用尽而参数仍然存在,则多余的参数将 评估(一如既往),但在其他方面被忽略。 fprintf 函数在何时返回 遇到格式字符串的结尾。
【讨论】:
【参考方案2】:您忘记将 fileSize 添加到您的 printf 中,而是从堆栈或寄存器中打印随机信息。
【讨论】:
【参考方案3】:正如 paxdiablo 指出的那样,您没有使用变量名。因此,printf 将获取堆栈上的值并尝试打印它 - 这是一种未定义的行为。
未定义的行为 如果格式的参数不足,则结果未定义。如果格式已用尽而参数仍然存在,则评估多余的参数,否则将被忽略。 见http://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=printf
【讨论】:
以上是关于文件大小总是在变化,使用 C 和 fopen_s 函数的主要内容,如果未能解决你的问题,请参考以下文章