2016-10-03 78 views
0

我是新來的C.我讀了一個文件,然後從那個文件中,我得到另一個文件的名稱,我需要再次閱讀。我將文件的名稱存儲在結構中,但是當我從結構中傳遞文件名時,它顯示錯誤。該程序編譯沒有錯誤,但顯示段錯誤:11如何在fopen()中傳遞一個struct成員作爲參數?

struct InfoConf { 
char log[20], file_path[20], log_path[30], ver[10]; 
}; 
int main(){ 

struct InfoConf configfile; 
char *str9 = "File Path"; 
char line[255]; 
FILE *fp; 
fp = fopen("config_1.conf","r"); 

while(fgets(line, sizeof(line), fp) != NULL){ 
    char* val1 = strtok(line, ":"); 
    char* val2 = strtok(NULL, ":"); 
    if(strcmp(str9, val1) == 0){ 
     strcpy(configfile.file_path, val2); 
    } 
} 

FILE *fp1; 
fp1 = fopen(configfile.file_path, "r"); 

if(fp1 == NULL){ 
    perror("Error in opening Meta-data file: "); //Error in opening Meta-data file: : No such file or directory 
} 

} 
+0

的第一項任務'configfile.file_path = 「testFile.mdf」'不會編譯,無論是語法和語義錯誤。 – CiaPan

+0

我實際上使用了strcpy(),請查看更新後的版本。同樣的錯誤。 – IOstream

+0

仍然沒有編譯。而不可編譯的代碼肯定不會工作。請顯示_actual_代碼段。 – CiaPan

回答

0

問題是,您不能直接使用「=」複製字符串。 正確的代碼是:

/* attention: "=" is used for string definition and assignment together */ 
char name[] = "testFile.mdf"; 

/* attention: strlen(name) < sizeof(configfile.file_path) 
*   strcpy function is used for string assignment after definition. 
**/ 
strcpy(configfile.file_path, name); 
/* add printf for debug */ 
printf("configfile.file_path:%s\n",configfile.file_path); 
0

也許是你的「路徑」在結尾處包含一個空白字符。
當U * x應用程序讀取Windows中準備的文本文件時,這是一個常見問題:類似DOS的行結尾由字符對CR,LF(^M^J,ASCII代碼13,10)組成,Unix/Linux應用程序只需要一個LineFeed(^J,代碼10) - 結果'多餘的'CR被附加到該行的'內容',並且您的應用可能試圖打開testFile.mdf^M文件而不是testFile.mdf

+0

如何解決這個問題? – IOstream

+0

@IOstream測試此問題是否首先出現問題。你的操作系統是什麼?什麼是你的配置文件的來源?它實際上是否具有CR + LF行結束符?如果是這樣,您的應用程序是否準備好正確識別它們? – CiaPan

0

始終添加檢查以確保您傳遞給strcpystrcmp的任何指針都是有效的指針。

更改while環路:

while(fgets(line, sizeof(line), fp) != NULL) 
{ 
    // Copy the line first before tokenizing so you have the original line 
    // for messages. 
    char line_copy[255]; 
    strcpy(line_copy, line); 

    char* val1 = strtok(line, ":"); 
    char* val2 = strtok(NULL, ":"); 
    if (val1 != NULL) 
    { 
     if(strcmp(str9, val1) == 0) 
     { 
     if (val2 != NULL) 
     { 
      strcpy(configfile.file_path, val2); 
     } 
     else 
     { 
      // Print diagnostic message. 
      printf("Unable to tokenize line: %s\n", line_copy); 
     } 
     } 
    } 
    else 
    { 
     // Print diagnostic message. 
     printf("Unable to tokenize line: %s\n", line_copy); 
    } 
} 
相關問題