有没有办法mmap stdin?

时间:2013-11-28 17:00:43

标签: c unix

我遇到以下问题:

我的工作是编写一个程序,该程序采用通过stdin传递给它的无符号整数,并打印出只有2位以上的数字设置为1的数字。我该怎么做才能有效?我做了一个程序版本,我用mmap读取文件中的数字,而且速度非常快。我读它就像一个非常大的* char缓冲区并使用strtol我'擦掉'每个数字并做我的检查和诸如此类的东西。

有没有办法以相同的方式操作通过stdin传递的字符串?我虽然使用fread缓冲,但是有一个问题,缓冲区切断了数字(意思是如果我通过“1024 35”而我有一个6字节的缓冲区,我会得到“1024 3”),我不禁思考如何解决这个问题。

来源:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h> /* mmap() is defined in this header */
#include <fcntl.h>
#include<string.h>
#include"apue.h"
int main (int argc, char *argv[])
{
 int fdin, fdout;
 char *src, *dst;
 struct stat statbuf;


 /* open the input file */
 if ((fdin = open (argv[1], O_RDONLY)) < 0)
   {printf("can't open %s for reading", argv[1]);return 1;}



 /* find size of input file */
 if (fstat (fdin,&statbuf) < 0)
    {printf("fstat error");return 1;}





 /* mmap the input file */
 if ((src = mmap (0, statbuf.st_size, PROT_READ, MAP_SHARED, fdin, 0))
   == (caddr_t) -1)
   {printf("mmap error for input");return 1;}

  char* beg=src;
  long x;
  char* end=&src[statbuf.st_size-1];
  while(src<end)
  {     
        beg=src;
        x = strtol (src,&src,10);
        if(!((x != 0) && ((x & (~x + 1)) == x)))
            fwrite(beg, 1, (int)(src-beg), stdout);    
  }
  return 0;
}

http://pastebin.com/EVhG3x79

1 个答案:

答案 0 :(得分:1)

我认为预期的解决方案是如何计算那些而不是如何从stdin读取。

int count_ones(int n);

意味着问题是如何有效地实现count_ones。 你的主要应该是这样的:

int main()
{
  int x;
  cin>>x;
  if( count_ones(x)>2){
    cout<<x<<endl;
  }
  return 0;
}

我认为预期的答案是:

  1. 使用数组大小​​256

  2. 为每个字节(= unsigned char)放入数组中的数量为1(可以是:从0到8)

  3. 将每个数字拆分为其字节,并对每个字节的数字求和。

  4. 返回结果