如何从输入文件中打印字符的二进制文件?

问题描述

我需要能够提取一个文本文件: 例如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]);
}

i0的迭代中,您将abuf[0]读入scanf()。然后,fgets()调用读取buf[0]上的换行符,并放置一个空字节以标记buf[1]上输入的结尾。因此,fprintf(stdout,…)调用(通常写为printf(…))产生换行符的数据,因为这是存储在buf[0]中的字符。

i1的迭代中,您将bbuf[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也与默认参数提升的定义有关。有更多讨论的余地,但是比回答这个问题要复杂得多。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...