从文件中读取多个整数,将它们转换为二进制,然后将它们打印到屏幕的指导?

时间:2016-06-21 09:36:37

标签: c binary integer

所以我知道这是一个很长的标题,但我会试着把它分解一下。

我正在尝试创建一个C程序,它将读取.txt文件中未定数量的整数(假设文件只包含整数,并且每个整数用新行分隔),然后再将每个转换为二进制形式,然后将其导出到屏幕。

我正在尝试逐步创建程序,到目前为止,我已设法创建一个转换为二进制的程序,但只能从单个用户输入的整数(请参阅下面的代码)。

#include<stdio.h>

int main(){

long int integerInput,quotient;

int binaryNumber[100],i=1,j;


printf("Enter any integer: ");

scanf("%ld",&integerInput);


quotient = integerInput;


while(quotient!=0){

     binaryNumber[i++]= quotient % 2;

     quotient = quotient / 2;

}


printf("Equivalent binary value of integer %d: ",integerInput);

for(j = i -1 ;j> 0;j--)

     printf("%d",binaryNumber[j]);


return 0;

}

我真的不确定如何有效地读取数字并逐一转换它们。我在一个包含10个不同整数的测试文件上尝试过如下所示的for循环(我已经声明了这个文件,并使用必要的文件I / O打开它)。

我尝试使用for循环编辑上面的代码,但这似乎没有帮助 - 它只是生成随机序列。

for(k=0;k<10;k++)
{
    fscanf(test, "%d", &decimalNumber);
.... // rest of above code is inserted here, minus the scanf and prompts for user to enter a number
return 0;

}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

一些建议:

  1. 使用int64_t中的#include<stdint.h>代替long int
  2. 检查错误,scanf成功与否:

    if (scanf("%ld", &integerInput) != 1){
        printf("incorrect input.\n");
        return 1; // error
    }  
    
  3. 您可以使用OS-pipe /重定向标准输入或文件:https://en.wikipedia.org/wiki/Redirection_(computing)
    因此您可以将scanf用于用户输入(stdin)和文件输入(os管道) 这个simpilies你编码。

  4. 所以其余的很简单:
    然后在循环中使用循环:使用scanf读取输入,然后转换为二进制,然后printf

    1. 您可以使用itoa中的#include<stdlib.h>将整数转换为字符串:

      int32_t n = 1234567890;
      char buf[65];
      itoa(n, buf, 2);
      printf("%s\n", buf);  // 1001001100101100000001011010010
      
    2. 并放在一起,
      工作示例代码:

      #include<stdio.h>
      #include<stdint.h>
      #include<stdlib.h> 
      
      int main(){
          int32_t n = 1234567890;
          char buf[65];
          while (1){
              if (scanf("%ld", &n) != 1){
                  //printf("incorrect input\n"); // or EOF
                  return 1; // error or EOF
              }
              itoa(n, buf, 2);
              printf("%s\n", buf);  // 1001001100101100000001011010010 
          }
          return 0;
      }
      

      并称之为:file1&lt; file2.txt

      如果您愿意,也可以使用fscanf 我希望这会有所帮助。

答案 1 :(得分:0)

循环输入文件的简单方法是:

while( fscanf( fp, "%ld", &inputInteger ) == 1 )
{
  // convert and display inputInteger
}

其中fp是您的输入流。 *scanf返回成功转化和分配的次数;由于我们只阅读单个项目,因此我们预计成功时返回值1。这将循环直到EOF或fscanf看到非空白,非十进制数字。

您可以使用可选的命令行参数从文件或标准输入读取程序:

int main( int argc, char **argv )
{
  FILE *fp = stdin; // default to standard input
  if ( argc > 1 )
  {
    if ( !(fp = fopen( argv[1], "r" )) )
    {
      fprintf( stderr, "Could not open %s\n", argv[1] );
      return EXIT_FAILURE;
    }
  }

  while ( fscanf( fp, "%ld", &inputInteger ) == 1 )
  {
    // convert and display integer
  }

  if ( fp != stdin )
    fclose( fp );
}