【问题标题】:Reading a config from a file从文件中读取配置
【发布时间】:2017-03-31 14:51:42
【问题描述】:

所以我试图从文本文件中读取并将其放入变量中

在文本文件中有

NAME= Bame
GAME= Fame

我听说过 strsep/strtok,但我仍然遇到问题,使用此代码我得到 Segmentation Fault 11

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

int main() {
char *token;
char *string;
char *tofree;
FILE *fp;
const char *file = "/tmp/test.txt"; 
fp = fopen(file, "r");
while(!feof(fp)) {
fgets(string, sizeof(string), fp);
token = strsep(&string, ",");
printf("%s", string);
}
fclose(fp);
exit(0);    
}

【问题讨论】:

  • char* string;不是字符串。它是指向“无处”的char 的指针,因为它没有被初始化。你写入这个未初始化的指针,从而调用 UB。因此崩溃。使用字符数组修复:char string[100];。另见Why is “while ( !feof (file) )” always wrong?。因此,请将您的 feof 替换为您的 fgets
  • fp = fopen(file, "r"); if (fp == NULL) { perror(Error opening file: "); return 1;}

标签: c string io fopen


【解决方案1】:

主要问题出在这一行:

fgets(string, sizeof(string), fp);

第二个参数应该是'Maximum number of characters to be copied into str'。在调用此函数之前,您应该已将 string 初始化为某个值。如果您查看我提供的链接中的示例,将string 更改为字符数组将帮助您更进一步。

char string[100];
....
fgets(string, 100, fp);    

之前您传递的是sizeof(string),但是由于字符串实际上是一种指针类型,因此您传递的是一个以字节为单位的指针大小(4 或 8 取决于平台)。 string 也是一个未分配的指针,因此 fgets 可能会写入随机内存地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2012-12-23
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多