我写了这个基本功能:
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”打开它,但仍然得到相同的不同数字..
答案 0 :(得分:2)
您可以获得不同的文件大小,因为以下行:
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指向的流,并在控制之下 格式指向的字符串,指定后续参数的方式 转换为输出。 如果格式的参数不足,则行为为 undefined。如果参数保留时格式已用尽,则多余的参数为 评估(一如既往),否则被忽略。 fprintf函数何时返回 遇到格式字符串的结尾。
答案 1 :(得分:1)
您忘了将fileSize添加到printf中,而是从堆栈或寄存器中打印随机信息。
答案 2 :(得分:0)
正如paxdiablo指出的那样,你没有使用变量名。因此,printf将获取堆栈上的值并尝试打印它 - 这是一种未定义的行为。
未定义的行为
如果格式的参数不足,则结果未定义。如果参数保留时格式已用尽,则会评估多余的参数,否则将忽略这些参数。
见http://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=printf