从C中的同一个文件中读取int和char

时间:2012-11-28 16:38:03

标签: c file input

我有一个看起来像这样的文本文件:

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

} 

}

5 个答案:

答案 0 :(得分:4)

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

应该是:

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

假设你定义了:

char command;
int data;

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

由于command只有足够的空间用于单个char,但格式说明符fscanf()的{​​{1}}将读取到下一个空格,然后将终止空字符写入{{ 1}}。使用"%s"来读取和限制要读取的command的数量。

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


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

i
3755

行的处理方式相同:

i 3755

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

NULL

答案 3 :(得分:1)

在这一行:

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

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

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

下一行无效,因为读取光标已经在文件的末尾。

答案 4 :(得分:0)

在您的fscanf函数中,您必须通过在格式末尾添加空格来返回行。喜欢这个

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

空格字符替换返回新行,制表和空格

BTW我看到您使用%s来读取字符&command,这是不正确的

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

你必须改用

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