【问题标题】:Read a line in C and split it读取 C 中的一行并将其拆分
【发布时间】:2015-05-23 23:07:29
【问题描述】:

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

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.什么不起作用? 2. 为什么要以二进制方式打开文件?
  • 1. sscanf 不起作用。当我尝试拆分 str 时触发错误。类似的东西进入无限循环2。因为我需要以二进制模式读取文件。
  • 什么错误被“解雇”了?
  • 您也可能希望对字符串进行零终止以使 sscanf 工作。
  • 你能显示一个 *.dat 文件吗?

标签: c fread scanf


【解决方案1】:

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);

【讨论】:

    【解决方案2】:
    1. 您永远不会以空值终止“str”,因此 sscanf 可以读取结尾。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2013-05-11
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多