【问题标题】:Read int and char from the same file in C从 C 中的同一文件中读取 int 和 char
【发布时间】:2012-11-28 16:38:02
【问题描述】:

我有一个如下所示的文本文件:

i 3755
i 3633
i 4435
i 1434

我将如何将其作为输入读取,我尝试使用 fscanf,但它一直在 'i' 之后给我一个随机字符

例如输出看起来像

i% 3755

i5 3633

等等

这是我一直在尝试的:

    int data = 0; 
char command; 
if(fptr==NULL)
    printf("File Cannot Be Read"); 

fscanf(fptr,"%c %d\n", &command, &data); 
printf("%c " , command);
printf("%d\n" , data);

fscanf(fptr,"%s %d\n", &command, &data); 
printf("%c " , command);
printf("%d\n" , data); 

fscanf(fptr,"%s %d\n", &command, &data); 
printf("%s " , command);
printf("%d\n" , data);

它们似乎都不起作用。提前感谢您的帮助!

编辑:以下是遇到相同问题的任何人的工作代码:

int data = 0; 
char command; 
fptr = fopen(argv[1], "r"); 

if(fptr==NULL)
    printf("File Cannot Be Read"); 

while(fscanf(fptr,"%c %d \n", &command, &data) == 2)
{

        if(command == 'i')
        {
            printf("insert found\n");
        }
            if(command == 'd')
        {
            printf("delete found\n");
        }

} 

}

【问题讨论】:

    标签: c file input


    【解决方案1】:
    fscanf(fptr,"%c %d", command, &data); 
    

    应该是:

    fscanf(fptr,"%c %d", &command, &data); 
    getchar();  // consume the newline character that fscanf left.
    

    假设你定义了:

    char command;
    int data;
    

    【讨论】:

    • 啊 getchar() 命令是我绝对缺少的,但是为什么我必须按 enter 才能让我的程序获得下一行??
    • ohhhh 我明白了,通过从 fscanf(fptr,"%s %d\n", &command, &data); 中删除 \n 来在没有 getchar() 的情况下工作当然会把它放在一个循环中。非常感谢大家的帮助
    【解决方案2】:

    为简单起见,我建议您循环使用fgets() 读取一行,然后使用strtok() 获取不同的“字符串”,然后根据您的解析方法进行转换。不过 Mike 也是对的,你可以使用fscanf(fptr, "%c %d\n", &command, &data) 阅读。使用字符串时,可以忽略变量名前的“&”。但是当它是字符或整数或浮点数时..您将需要使用 operator("&") 的地址

    【讨论】:

      【解决方案3】:

      在这一行:

      fscanf(fptr,"%c %d", command, &data); 
      

      你应该给它一个指向命令的指针。像这样:

      fscanf(fptr,"%c %d", &command, &data); 
      

      下一行无法工作,因为读取光标已经在文件末尾。

      【讨论】:

        【解决方案4】:

        这是不正确的,会导致缓冲区溢出:

        fscanf(fptr,"%s %d", &command, &data);
        

        因为command 仅具有足够的空间容纳单个char,但带有格式说明符"%s" 的fscanf() 将读取到下一个空格,然后将终止空字符写入command。使用char[] 读取并限制要读取的chars 的数量。

        请注意,NULL 检查只是打印一条错误消息,它实际上并不阻止使用 NULL 文件指针。


        为确保每一行的格式正确,请使用fgets() 读取一行,然后使用sscanf() 读取字段。如果使用fscanf() 直接从文件中读取,那么这两行行:

        一世 3755

        与 single 行的处理方式相同:

        我 3755

        作为换行符也是空格。 示例:

        if (fptr)
        {
            char line[1024];
            while (fgets(line, 1024, fptr))
            {
                char command;
                int data;
                if (2 == sscanf(line, "%c %d", &command, &data))
                {
                    /* Use 'command' and 'data'. */
                }
            }
        }
        

        【讨论】:

          【解决方案5】:

          在您的fscanf 函数中,您必须期望通过在格式末尾添加空格来返回行。像这样

          fscanf(fptr,"%c %d ", &command, &data);
          

          空格字符替换换行符、制表符和空格

          顺便说一句,我看到您使用 %s 来读取字符 &command,这是不正确的

          fscanf(fptr,"%s %d\n", &command, &data); 
          

          你必须改用这个

          fscanf(fptr,"%c %d ", &command, &data); 
          

          【讨论】:

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