簡體   English   中英

處理文件擴展名 C

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM