2015-06-15 229 views
1

我想運行一個程序,並允許用戶在同一行上輸入。我檢查文件是否存在,如果不是,打印打印文件名到標準輸出

FILE:沒有這樣的文件或目錄

FILE* filename; 
    filename = fopen(argv[2], "wb"); 
     //validate file name 
     if(!filename) { 
      perror(filename); 
      return EXIT_FAILURE; 
     } 

當我編譯,我得到以下警告:

期望的字符*â,但參數類型爲'結構文件'â

+0

什麼是'filename'類型?一個'char *'? –

+0

我完全困惑的問題的措辭.. –

+0

@EugeneSh。哈哈。耐心,我的朋友......讓OP添加更多信息... –

回答

2
FILE* filename; 
    filename = fopen(argv[2], "wb"); 
     //validate file name 
     if(!filename) { 
      fprintf(STDERR,"%s", filename); 
      perror(" files to open: "); 
     } 

perror打印錯誤消息,後面跟着最後一個錯誤的字符串表示形式;

+0

是不是隻是把*任何*字符串直接交給'fprintf'一個潛在的安全漏洞? – usr2564301

3

在上面的代碼中,filenameFILE *,而不是具有文件名稱的字符串。由於argv[2]似乎是文件名,你可以嘗試:

 if(!filename) { 
      perror(argv[2]); 
      return EXIT_FAILURE; 
     } 

...但你應先檢查argv[2]設置(即argc > 2)。

1

代碼需要打印名稱的文件,而不是FILE *的值爲NULL

打印文件的名稱是不明智的,打開文件時無法進行額外的檢查而無法打開。用引號或其他名稱打印名稱也很好,以幫助劃分麻煩文件名的開頭和結尾。

由於變量不是文件的名稱名稱,所以OP的原始「文件名」是文件變量名稱的弱選項。建議諸如「output_file」之類的東西。 argv[2]是文件的名稱。

const char *filename = argv[2]; 
FILE* output_file; 

output_file = fopen(filename, "wb"); 
//validate file pointer 
if(!output_file) { 
    perror("Unable to open file for writing."); 
    if (argc > 2 && filename) { 
    fprintf(stderr, "\"%s\"\n", filename); 
    } 
    return EXIT_FAILURE; 
} 
0

在這條線:

perror(filename); 

是指的一個指針文件描述符 不是指向一個字符的字符串。

推薦使用:

perror(argv[2]); 

順便說一句:PERROR()輸出到stderr,不stdout中

相關問題