【问题标题】:reading a file using fscanf使用 fscanf 读取文件
【发布时间】:2014-01-25 21:06:28
【问题描述】:

我的程序有点问题。 它应该读取包含“i”的文件的第一行,然后打印出“i”列。 我不知道如何“修复”它

char czytaj(const char *fname)
{
FILE *fh = fopen(fname,"r"); 
int i;
char tabelka[100][100];
int k=0;
int w=0;
if(fh == NULL)
{
    printf("cos zjebales\n");
    return 0;
}

fscanf(fh,"%d",&i); 
printf("%d\n", i);
//while(!feof(fh))
//while(k<5)
{
fscanf(fh,"%s",&tabelka[k][w]);
if(tabelka[k][w]=='\n')
{
    w=w+1;
    k=0;
}
else
{   
    k=k+1;
}
}


fclose(fh);
}

这是文件

3 \n
Kol01 Kol02 Kol03 Kol04 \n
aa 10 11 31 \n
bb 20 21 32 \n
cc 30 31 33 \n
dd 40 41 43 \n

:)

【问题讨论】:

  • 表达式&amp;tabelka[k][w] 并没有按照您的预期执行,尤其是在fscanf 的上下文中,"%s" 格式。我建议您在调试器中单步执行程序,同时监控所有变量值(尤其是数组)。
  • 缩进怎么了?

标签: c file scanf


【解决方案1】:
int czytaj(const char *fname){
    FILE *fh = fopen(fname, "r"); 
    int col, row;
    int i, ch;
    char tabelka[100][100];

    if(fh == NULL){
        printf("cos zjebales\n");
        return 0;
    }

    fscanf(fh,"%d", &col); 
    printf("%d\n", col);
    --col;//to 0 orign from 1 origin

    for(row = 0;EOF!=(ch = getc(fh));++row){
        ungetc(ch, fh);
        for(i=0;i<col;++i)
            fscanf(fh, " %*s");//skip col-1 column

        fscanf(fh, " %s", tabelka[row]);
        printf("%s\n", tabelka[row]);
        while('\n' != (ch = getc(fh)) && EOF != ch)
            ;
    }
    fclose(fh);
    return 1;
}

【讨论】:

    【解决方案2】:

    fscanf 不是该任务的正确例程。它跨行读取非空白*的标记,即它像对待任何其他空白一样对待行尾。

    对于分隔列的任务,最好用fgets 读取每一行,然后用strtok 拆分字符串,直到到达所需的列。整张表不需要空间,一行一行地处理,只为当前行使用一个大小合理的 char 缓冲区。

    *) 暂时忽略 %[...] 说明符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多