我的印象非常强烈,我只是不明白fscanf是如何运作的。
我有一个格式如下的文本文件:
0x01
0x02
0x04
0x08
0x0F
0x1F
0x2F
0x4F
我想阅读它们:
inline void read_inputs_from_ip_if(){
if(fscanf(ipf,"%x",&input)==EOF){
printf("Terminated.");
exit(0);
}
fscanf(ipf,"%x",&input);
}
但问题是每当我在输入上使用print语句时,它就会产生0。 我想连续读取每一行,并在一个永无止境的for循环中执行一些决策逻辑。问题是它根本不会读入任何输入。
这是主要块:
ipf = fopen("input.txt","r");
for (; ; )
{
read_inputs_from_ip_if();
printf("Input: %x \n", input);
control_action();
write_output_to_op_if();
}
正如我前面提到的,输入永远不会从0变化。 我的印象是,由于循环,fscanf将读取一个新行,直到它到达文件末尾...现在我不太确定。
答案 0 :(得分:2)
使用:
fscanf(ipf,"%x\n",&input);
逐行读取,因为省略了结束行字符('\ n') 然后,因为hexa值用大写字母格式化 使用:
fscanf(ipf,"%X\n",&input);
答案 1 :(得分:1)
您根本没有为程序指定换行符的存在。
此外,您执行“fscanf”两次,以便程序每两跳一行。
#include <stdio.h>
#include <stdlib.h>
int input;
FILE *ipf;
inline void read_inputs_from_ip_if(){
if(fscanf(ipf,"%x\n",&input)==EOF){
printf("Terminated\n");
exit(0);
}
}
int main() {
ipf = fopen("fscanf-data", "r");
for(;;)
{
read_inputs_from_ip_if();
printf("Datum: 0x%02x\n", input);
}
fclose(ipf);
return 0;
}
然而,我认为如果函数不依赖于外部变量,并且没有单独退出(或生成输出),而是发回给调用程序,那么你会做得更好。
#include <stdio.h>
#include <stdlib.h>
inline int read_inputs_from_ip_if(FILE *ipf) {
int input;
if (EOF == fscanf(ipf,"%x\n",&input)) {
return EOF;
}
return input;
}
int main() {
int input;
FILE *ipf;
ipf = fopen("fscanf-data", "r");
if (NULL == ipf) {
fprintf(stderr, "File not found\n");
return -1;
}
for(;;) {
input = read_inputs_from_ip_if(ipf);
if (EOF == input) {
// We just exit the loop.
break;
}
printf("Datum: 0x%02x\n", input);
}
printf("Terminated.\n");
fclose(ipf);
return 0;
}
无论哪种方式,输出都是预期的:
Datum: 0x01
Datum: 0x02
Datum: 0x04
Datum: 0x08
Datum: 0x0f
Datum: 0x1f
Datum: 0x2f
Datum: 0x4f
Terminated.