读取 C 中的一行并将其拆分

Read a line in C and split it

我在尝试将 'str' 拆分为 2 个 int 变量和 1 个 char 变量时遇到问题。这是一个代码:

FILE *fp;
int i,j;
char str[8];
char valor;
if(!(fp = fopen("miniflota_g.dat","rb"))){
    printf("Error opening file.");
    getch();
    return;
}
while(fread(str,sizeof(str),1,fp) == 1){
    sscanf(str,"%d %d %c",i,j,valor);
    printf("%d %d %c",i,j,valor);
}
fclose(fp);

这是一个错误:

感谢您的帮助。

  1. 你永远不会空终止 'str' 所以 sscanf 可以读取结尾。

  2. 您需要将输出变量的地址而不是值传递给 sscanf。 (例如 &i 而不是 i)。

  3. 如果您启用编译器警告(-Wall with gcc),您的编译器至少会警告您第二点。

sscanf() 仅适用于标准 C 0 终止字符串。 fread() 不会在读取的内容后附加 0。如果要读取 8 个字节并使用 sscanf(),则需要先以 0 终止数据。所以你的数组需要至少 9 个字节大,所以你可以在数据后附加一个 0。

还需要将变量地址传递给它,这样它才能写入它们。

所以它看起来应该更像这样:

FILE *fp;
int i,j;
char str[9] = { 0 };
char valor;
if(!(fp = fopen("miniflota_g.dat","rb"))){
    printf("Error opening file.");
    getch();
    return;
}
while(fread(str,sizeof(str)-1,1,fp) == 1){
    sscanf(str,"%d %d %c",&i,&j,&valor);
    printf("%d %d %c",i,j,valor);
}
fclose(fp);