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;
}
的數字,都作爲文本的形式傳遞,或直接到fwrite'd在他們的'無符號int'形式流? – Medinoc
爲什麼選擇mmap?除非你有某種方法來檢測一個數字何時切斷v.s.一個自然結束的數字,你停止閱讀標準輸入,你仍然會在同一條船上。例如如果你通過'1 2 3',任何一個標準輸入都在兩個之後結束。你怎麼知道2完成了,實際上並不是'1 23456 3'? –
它們作爲文本傳遞。 –