2014-06-10 76 views
-3

當我檢查argv[1]argv[2]時,我無法打開並寫入它們!如果我不寫這個檢查,那麼所有的東西都可以工作。我也必須使用命令行參數。當我檢查argv [1]和argv [2]時我無法打開並寫入它們

while (i < MAXADAT && kilep) 
    { 
     hianyzofajleredmeny = 1; 
     if ((argv[2][i] == '.' && argv[2][i + 1] == 'c' && argv[2][i + 2] == 's' && argv[2][i + 3] == 'v' && argv[2][i + 4] == '\0')) 
     { 
      hianyzofajleredmeny = 0; 
      kilep = 0; 
     } 
     i++; 

主要

int main(int argc, char **argv[]) 

部分我在做什麼錯?

+2

請發佈實際的代碼不工作。順便說一句,這裏的長線可以用'!strcmp(argv [2] + i,「.csv」)代替' –

+0

這裏是一個鏈接! 整個程序! 基本上我打開一個cvs文件廣告與他們任務比我寫它一個新的csv文件! http://www.speedyshare.com/JaA7S/VEGLEGES-vegleg.txt – user3724530

+3

顯然,我必須下載一個.exe才能從該網站獲取內容。除了'.exe'在Mac上無法工作這一事實,我不會使用一個需要他們的下載器的網站,因爲這樣的事情是微不足道的。 –

回答

0

沒有太多的魔法參與。您沒有顯示足夠的代碼讓我們知道您真正想做什麼,但是此代碼將打開argv[1]argv[2]中指定的文件。

#include <stdio.h> 
#include <string.h> 

int main(int argc, char **argv) 
{ 
    if (argc != 3) 
    { 
     fprintf(stderr, "Usage: %s file1 file2\n", argv[0]); 
     return 1; 
    } 
    char *dot1 = strrchr(argv[1], '.'); 
    if (dot1 == 0 || strcmp(dot1, ".csv") != 0) 
    { 
     fprintf(stderr, "%s: file %s is not a CSV file\n", argv[0], argv[1]); 
     return 1; 
    } 
    FILE *fp1 = fopen(argv[1], "r"); 
    if (fp1 == 0) 
    { 
     fprintf(stderr, "%s: failed to open %s for reading\n", argv[0], argv[1]); 
     return 1; 
    } 
    char *dot2 = strrchr(argv[2], '.'); 
    if (dot2 == 0 || strcmp(dot2, ".csv") != 0) 
    { 
     fprintf(stderr, "%s: file %s is not a CSV file\n", argv[0], argv[2]); 
     return 1; 
    } 
    FILE *fp2 = fopen(argv[2], "w"); 
    if (fp2 == 0) 
    { 
     fprintf(stderr, "%s: failed to open %s for writing\n", argv[0], argv[2]); 
     return 1; 
    } 

    char buffer[1024]; 
    size_t nbytes; 

    while ((nbytes = fread(buffer, sizeof(char), sizeof(buffer), fp)) != 0) 
     fwrite(buffer, sizeof(char), nbytes, fp2); 

    fclose(fp1); 
    fclose(fp2); 
    return 0; 
} 

這將是明智的錯誤檢查fclose(fp2);如果失敗,則輸出文件未成功創建。一般錯誤檢查fclose(fp1)不太重要。

代碼將受益於錯誤報告功能,以便錯誤報告塊只佔用一行而不是四行,但是編寫一個函數來完成這項工作只比您準備處理更復雜一點。不是太複雜,但足以讓我不會超負荷你。儘管如此,代碼非常冗長。

該代碼還假定您有C99或C11,因此您可以在函數的任意點處聲明變量。如果你堅持使用C89,那麼(a)是時候升級到可以使用15歲而不是25歲的標準的時間了,(b)你必須將所有變量聲明移到函數的頂部並將初始化更改爲賦值。