我有一个看起来像这样的文本文件:
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");
}
}
}
答案 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);