问题描述
我需要能够提取一个文本文件: 例如text.txt
CALayer.shouldRasterize = YES
,我需要打印这些字符的二进制值。这是我到目前为止所写的:
a
b
c
0
1
2
这是我当前的输出:
#include "p01.h"
int main(int argc,char **argv) {
FILE *fptr = fopen(argv[1],"r");
char buf[50];
for(long i =0; i<6; i++) {
fscanf(fptr,"%c",&buf[i]);
fgets(buf,50,fptr);
fprintf(stdout,"[%d]%c %d\n",i,buf[i],(int)buf[i]);
}
return 0;
}
我不太确定为什么要打印换行符,跳过a和b,然后甚至不知道如何打印它们的位。任何帮助将不胜感激。
解决方法
您的循环是:
for (long i = 0; i < 6; i++) {
fscanf(fptr,"%c",&buf[i]);
fgets(buf,50,fptr);
fprintf(stdout,"[%d]%c %d\n",i,buf[i],(int)buf[i]);
}
在i
为0
的迭代中,您将a
和buf[0]
读入scanf()
。然后,fgets()
调用读取buf[0]
上的换行符,并放置一个空字节以标记buf[1]
上输入的结尾。因此,fprintf(stdout,…)
调用(通常写为printf(…)
)产生换行符的数据,因为这是存储在buf[0]
中的字符。
在i
为1
的迭代中,您将b
和buf[1]
读入scanf()
。然后,对fgets()
的调用将读取buf[0]
上的换行符,并放置一个空字节以标记buf[1]
上的输入结束。因此,打印操作将打印有关空字节的数据,因为它是存储在buf[1]
中的字符。
在随后的迭代中,fgets()
调用继续在buf[0]
和buf[1]
上进行覆盖,但是您的其余代码将照看这些字符,并且不受影响。
像这样混合scanf()
和fgets()
是可疑的。最好只使用
if (scanf(fptr," %c",&buf[i]) != 1)
break;
并完全放下fgets()
。格式字符串中的前导空格会跳过可选的空白,表示空白,制表符和(关键是)换行符。在第一次迭代中,它什么也不会跳过。第二步,它跳过换行符并继续读取b
。而且没有令人困惑的覆写。如果添加空终止符,则在循环和空终止之后的abc123
中将有字符串buf
。
或者,只需使用fgets()
并始终与buf[0]
一起使用。
请注意,强制转换为int
并不重要。将char
值传递给printf()
或fprintf()
时,它会自动转换为int
-两个参数buf[i]
都以int
的形式传递,无论演员表是否存在。参见C11 §6.5.2.2 Function calls ¶7 —和¶6也与默认参数提升的定义有关。有更多讨论的余地,但是比回答这个问题要复杂得多。