我是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
}
}
答案 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)
始终添加检查以确保传递给strcpy
和strcmp
的任何指针都是有效指针。
将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);
}
}