2012-10-12 32 views
0

我目前正在編寫一個簡單的一次性填充程序。我希望它在keyfile小於source文件時提醒用戶,但是當我運行它時,我的程序完全忽略它。C程序忽略語句是否包含大小

/* Check if keyfile is the same size as, or bigger than the sourcefile */ 
if(sizeof keyfile < sizeof sourcefile) 
{ 
printf("Source file is larger than keyfile.\n"); 
printf("This significantly reduces cryptographic strength.\n"); 
printf("Do you wish to continue? (Y/N)\n"); 
scanf("%c", &ans); 
if(ans == 'n' || ans == 'N') 
    { 
    return (1); 
    } 
if(ans == 'y' || ans == 'Y') 
    { 
    printf("Proceeding with Encryption/Decryption.\n"); 
    } 

我懷疑問題在於我使用sizeof,但我不知道任何其他的選擇嗎?任何關於如何改變我的代碼以使其工作的建議?

編輯:我曾嘗試添加fstat盡我的能力,但它仍然反應以同樣的方式...這裏是我做過什麼:

/* Get size of sourcefile. */ 
if((sourcefile = fopen(argv[1], "rb"))== NULL) 
{ 
printf("Can't open source file.\n"); 
printf("Please enter a valid filename.\n"); 
printf("USAGE: OTP <source file> <output file> <keyfile>\n"); 
return (1); 
} 

fflush(sourcefile); 
fstat(fileno(sourcefile), &statbuf); 
fclose(sourcefile); 

/* Get size of keyfile. */ 
if((keyfile = fopen(argv[3], "rb"))== NULL) 
{ 
printf("Can't open keyfile.\n"); 
printf("Please enter a valid filename.\n"); 
printf("USAGE: OTP <source file> <output file> <keyfile>\n"); 
return(1); 

fflush(keyfile); 
fstat(fileno(keyfile), &keybuf); 
fclose(keyfile); 
} 

和改變的,如果第一線陳述被忽略:

if((keybuf.st_size) < (statbuf.st_size)) 

爲什麼它仍然被程序忽略?

感謝那些花時間回答的人。

+1

http://stackoverflow.com/questions/238603/how-can-i-get-a-files-size-in-c – Paulpro

+0

由於決策是在編譯時進行的,顯示了變量的正確聲明' keyfile'和'sourcefile'可能無所謂,但爲了完整性,你應該這樣做。 –

+1

如果您希望人們看到它,並且爲了便於閱讀,請考慮創建另一個問題。 – tomahh

回答

10

sizeof不返回文件的大小。 sizeof用於檢查類型在內存中佔用的字節數。

看看this文章如果您想了解更多關於獲取文件大小的信息,

5

sizeof是一個編譯時操作符,以字節爲單位產生其操作數數據類型的大小。你確定這就是你想要做的嗎?我非常懷疑,因爲它似乎要比較文件大小。 (fopen()fseek()結束,ftell()得到文件的大小,或任何更舒適的功能,您的操作系統」 API爲您提供。)

4

sizeof是一個一元運算符,用於計算數據類型的大小。你不能用它來查找/比較文本文件的大小。

3

您需要使用stat才能獲取文件的大小。

+0

不,他需要使用'GetFileSizeEx()'...... – DevSolar

+0

如何獲得文件大小取決於平臺,當然......這就是爲什麼它不被C標準覆蓋。對於POSIX-ish系統,'stat'是正確的。對於其他平臺,答案因平臺而異。 –

+2

@DevSolar - 如果是Windows,則爲True。但Windows確實支持POSIX,stat是POSIX。使它更容易移植到UNIX(以及其他一些操作系統) –