2013-11-28 128 views
3

我有一個以下問題:有沒有辦法來mmap stdin?

我的工作是編寫一個程序,採用無符號整數數字,通過標準輸入傳遞給它,並打印出只有超過2位設置爲1的數字。我應該如何有效地做到這一點?我做了一個程序的版本,我使用mmap從文件中讀取數字,而且速度很快。我讀它像一個非常大的* char緩衝區,並使用strtol我'擦洗'每個數字,並做我的支票和whatnot。

有沒有辦法通過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

的數字,都作爲文本的形式傳遞,或直接到fwrite'd在他們的'無符號int'形式流? – Medinoc

+3

爲什麼選擇mmap?除非你有某種方法來檢測一個數字何時切斷v.s.一個自然結束的數字,你停止閱讀標準輸入,你仍然會在同一條船上。例如如果你通過'1 2 3',任何一個標準輸入都在兩個之後結束。你怎麼知道2完成了,實際上並不是'1 23456 3'? –

+0

它們作爲文本傳遞。 –

回答

1

我認爲預期的解決方案是怎麼算的那些,而不是如何從標準輸入讀取。

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. 爲把每個字節(=無符號字符)數組在其位置上的數量(可以是:從0到8)

  3. 將每個數字拆分爲其字節並將每個數字的和相加工商業污水附加費。

  4. 返回結果