一、獲取文件大小錯誤
在獲取文件大小時,可能會出現錯誤。其中,errno
變量可以幫助我們定位錯誤。
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp = fopen("test.txt", "r");
if(fp == NULL) {
printf("打開文件失敗,錯誤碼:%d\n", errno);
} else {
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fclose(fp);
printf("文件大小:%ld 字節\n", size);
}
return 0;
}
在這個例子中,我們打開了一個叫做 test.txt
的文件。如果打開文件失敗,我們將輸出錯誤碼。如果打開文件成功,我們利用 fseek
函數將文件指針移到文件末尾,利用 ftell
函數獲取文件指針的位置,即文件大小。
二、C++獲取文件大小
在 C++ 中,我們可以使用標準庫中的文件流對象來獲取文件大小。
#include <iostream>
#include <fstream>
int main() {
std::ifstream ifs("test.txt", std::ios::binary | std::ios::ate);
std::streamsize size = ifs.tellg();
ifs.close();
std::cout << "文件大小:" << size << " 字節" << std::endl;
return 0;
}
在這個例子中,我們構造了一個 std::ifstream
對象,並打開了 test.txt
文件。將該對象與 std::ios::ate
標誌一起傳遞給構造函數,可以在打開文件時將文件指針移至文件末尾。接着,我們使用 tellg
函數獲取文件大小。
三、獲取文件大小程序
通過編寫一個獲取文件大小的程序,我們可以更方便地多次使用。
#include <stdio.h>
long getFileSize(const char* filename) {
FILE* fp = fopen(filename, "r");
if(fp == NULL) {
return -1;
}
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fclose(fp);
return size;
}
int main() {
long size = getFileSize("test.txt");
if(size == -1) {
printf("打開文件失敗\n");
} else {
printf("文件大小:%ld 字節\n", size);
}
return 0;
}
在這個例子中,我們編寫了一個名為 getFileSize
的函數來獲取文件大小。這個函數接受一個 const char*
類型的文件名,返迴文件大小。我們將之前提到的文件大小獲取方法封裝在了函數中,並通過返回值來告知函數調用者獲取文件大小的結果。
四、獲取文件大小 SHA 碼
在進行文件傳輸時,我們可以通過獲取文件的 SHA 碼來檢驗文件完整性。
#include <openssl/sha.h>
#include <stdio.h>
#define BLOCK_SIZE 1024
int main() {
FILE* fp = fopen("test.txt", "r");
if(fp == NULL) {
printf("打開文件失敗\n");
return 0;
}
unsigned char hash[SHA_DIGEST_LENGTH];
SHA_CTX sha_ctx;
SHA1_Init(&sha_ctx);
unsigned char buffer[BLOCK_SIZE];
int len;
while((len = fread(buffer, 1, BLOCK_SIZE, fp)) > 0) {
SHA1_Update(&sha_ctx, buffer, len);
}
fclose(fp);
SHA1_Final(hash, &sha_ctx);
printf("文件 SHA 值:");
for(int i = 0; i < SHA_DIGEST_LENGTH; ++i) {
printf("%02x", hash[i]);
}
printf("\n");
return 0;
}
在這個例子中,我們利用 OpenSSL 庫中提供的 SHA 函數求取文件 SHA 碼。我們使用 SHA1_Init
初始化 SHA 計算,使用 SHA1_Update
處理文件數據,使用 SHA1_Final
計算 SHA 碼。
五、獲取文件大小失敗
在極端情況下,獲取文件大小可能會失敗。這時我們需要進行錯誤處理,或者選擇其他的獲取文件大小的方法。
#include <stdio.h>
int main() {
FILE* fp = fopen("test.txt", "r");
if(fp == NULL) {
printf("打開文件失敗\n");
return 0;
}
fseek(fp, 0, SEEK_END);
if(ferror(fp)) {
printf("計算文件大小失敗\n");
} else {
long size = ftell(fp);
printf("文件大小:%ld 字節\n", size);
}
fclose(fp);
return 0;
}
在這個例子中,我們使用 ferror
函數來判斷獲取文件大小的結果是否失敗。
六、獲取文件大小 C
在 C 語言中,我們可以通過 stat
函數獲取文件屬性,其中包括文件大小。
#include <sys/stat.h>
#include <stdio.h>
int main() {
struct stat st;
if(stat("test.txt", &st) != 0) {
printf("獲取文件屬性失敗\n");
} else {
long size = st.st_size;
printf("文件大小:%ld 字節\n", size);
}
return 0;
}
在這個例子中,我們使用 stat
函數獲取文件屬性,其中包括文件大小。通過訪問 st_size
字段獲取文件大小。
七、獲取文件大小的函數
在 C++ 標準庫中,也提供了一個能夠獲取文件大小的函數。
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
std::streamsize size = fs::file_size("test.txt");
std::cout << "文件大小:" << size << " 字節" << std::endl;
return 0;
}
在這個例子中,我們使用 C++17 中引入的 std::filesystem
庫。利用 std::file_size
函數可以獲取文件大小。
八、獲取文件大小 WC-L
在 Windows 系統下,我們可以使用 GetFileSize
函數獲取文件大小。
#include <windows.h>
#include <stdio.h>
int main() {
HANDLE hFile = CreateFile("test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE) {
printf("打開文件失敗\n");
return 0;
}
DWORD dwSize = GetFileSize(hFile, NULL);
if(dwSize == INVALID_FILE_SIZE) {
printf("獲取文件大小失敗\n");
} else {
printf("文件大小:%ld 字節\n", dwSize);
}
CloseHandle(hFile);
return 0;
}
在這個例子中,我們使用 GetFileSize
函數獲取文件大小。在使用前需要先通過 CreateFile
函數打開文件。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/310072.html