如何在fopen()中传递struct成员作为参数?

时间:2016-10-03 05:46:42

标签: segmentation-fault

我是C的新手。我读了一个文件,然后从那个文件中,我得到另一个文件的名字,我需要再次阅读。我将文件的名称存储在结构中,但是当我从结构中传递文件名时,它显示错误。该程序编译时没有错误,但显示了分段错误:11

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
}

}

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

可能是你的路径&#39;最后包含一个空格字符 当U * x应用程序读取在Windows中准备的文本文件时,这是一个常见问题:类似DOS的行结尾由字符对CR,LF(^M^J,ASCII代码13,10)和Unix / Linux应用程序组成我们只需要一个LineFeed(^J,代码10) - 因此多余的&#39; CR附加到&#39;内容&#39;该行,您的应用可能正在尝试打开testFile.mdf^M文件,而不是testFile.mdf

答案 2 :(得分: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);
   }
}