3

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

i 3755
i 3633
i 4435
i 1434

我将如何将其作为输入阅读,我尝试使用 fscanf,但它在“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");
        }

} 

}

4

5 回答 5

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;
于 2012-11-28T16:39:58.690 回答
1

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

于 2012-11-28T16:40:35.540 回答
1

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

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

ascommand只有一个足够的空间,charfscanf()带有格式说明符"%s"的将读取到下一个空格,然后将终止的空字符写入command. 使用 achar[]读取并限制要char读取的 s 的数量。

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


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

一世
3755

单行相同:

我 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'. */
        }
    }
}
于 2012-11-28T16:45:12.443 回答
1

在这一行:

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

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

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

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

于 2012-11-28T16:45:46.710 回答
0

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

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

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

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

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

你必须改用这个

fscanf(fptr,"%c %d ", &command, &data); 
于 2012-11-28T17:05:51.277 回答