[英]Processing file extensions in C
我正在 C 中開發一些代碼,這些代碼讀取文件擴展名並將其作為代碼存儲在一個字節中,無論是處理文本文件還是二進制文件。 稍后我希望恢復以字節編碼的文件擴展名。
作為測試,我在主 function 中創建了一個循環,我可以在其中測試第二個列表中的 function fileExtenCode()。
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define EXLEN 9
#define EXNUM 8
typedef unsigned char BYTE;
bool fileExtenCode(char*, BYTE*, int*);
int main(void) {
char fileExten[EXLEN];
BYTE code;
int bin;
for (;;) {
printf("Type file extension: ");
scanf_s("%s", fileExten, EXLEN);
if (fileExten[0] == '.') break;
printf("%s\n", fileExten);
code = 0;
bin = 0;
bool extFound = fileExtenCode(fileExten, &code, &bin); // <== (1)
if (extFound) printf("Extension found: TRUE\n");
else printf("Extension found: FALSE\n");
printf("%s%d", "Code: ", code);
if (bin) printf(" binary file\n");
else printf(" text file\n");
printf("\n");
printf("Type code: ");
int icode;
scanf_s("%d", &icode);
code = icode;
bin = -1;
fileExtenCode(fileExten, &code, &bin); // <== (2)
printf("%s", fileExten); // <== (5)
printf("\n");
}
return 0;
}
我要測試的 function 如下:
bool fileExtenCode(char* ext, BYTE* code, int* binary) {
char *fileEx[EXNUM] = {
"jpg1", "txt0", "html0", "xml0", "exe1", "bmp1", "gif1", "png1"};
if (*binary < 0) { // <== (3)
ext = fileEx[*code]; // <== (4)
return true;
}
size_t extLen = strlen(ext);
for (BYTE i = 0; i < EXNUM; i++) {
if (strncmp(fileEx[i], ext, extLen) == 0) {
*binary = (fileEx[i][extLen] == '1') ? 1 : 0;
*code = i;
return true;
}
}
return false;
}
這個想法是,您將帶有文件擴展名的字符串傳遞給 main 中語句 (1) 中的 fileExtenCode(),然后 function 在數組中搜索該擴展名,如果找到則返回 true 以及指示數組中 position 的代碼參數文件擴展名和二進制標志為 0 或 1,指示文件是文本文件還是二進制文件。 “0”或“1”緊跟數組中的文件擴展名。 如果沒有找到擴展名,則 function 返回 false,arguments 中的返回值沒有任何意義。
到目前為止一切順利,這部分工作正常。 但是,在給定代碼輸入值的情況下,反向使用function恢復文件擴展名,在main中調用with語句(2)時失敗。 在這種情況下,二進制設置為 -1,然后調用 function,此時 (3) 處的條件為真,(4) 中的 ext 恢復文件擴展名。 當在 (4) 之后立即插入一個臨時打印語句時確認這一點,但是這個值不會在 (5) 回到 main 中返回,而是打印一個舊的輸入值。
顯然指針有問題,但我看不到修復它的明顯方法。 我的問題是如何在不弄亂正常工作的代碼 rest 的情況下更正此問題? 請注意,char* ext 和 BYTE* code 用於輸入和 output,而 int* binary 用作輸入標志,設置為 -1 時不返回任何有用值。
一旦解決了這個問題,那么當二進制標志設置為 -1 時,將二進制標志與擴展名分開應該相對容易。 最終我計划有更多的文件擴展名,但直到這對 8 個樣本都能正常工作。
獲得解決此問題的幫助將不勝感激。
好的,非常感謝 pmg,這有效,除了我必須使用:
strcpy_s(ext, EXLEN, fileEx[*code]);
因為 Visual Studio 2022 編譯器會標記錯誤。 這也解決了我在使用 const 關鍵字聲明數組 *fileEx[EXNUM] 時收到的警告。
昨晚我匆忙中省略了聲明:
if (*code >= EXNUM) return false;
在 (3) 之后立即捕獲 *code 超出 *fileEx[EXNUM] 范圍的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.