2015-06-28 9 views
0

Я хочу прочитать файл с несколькими символами в нем и проверить процент печатаемых символов, а также процент белых пробелов. Это мой Python код, который генерирует входной файл:2 разных выхода из входного файла, итерации из mmap и чтения с помощью куска в C

import string 
import random 
array = list() 
array = list(string.printable) 
print(array) 
external = ['\0','\a','\b','\v','\f','\e'] 
array = array + external 
file = open("in.txt" , 'w') 
for i in range (1000): 
     outputline = array[random.randrange(0,len(array)-1)] 
     file.write(outputline) 
file.close() 

Я хочу, чтобы мой файл, чтобы иметь как печатаемые символы и пробелы и другие символы (которые не находятся в этих двух группах). я сделать это двумя способами:

  1. Прочитайте файл, кусок на кусок, с read системного вызова в C:

    #include <stdio.h> 
    #include <stdio.h> 
    #include <ctype.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <sys/types.h> 
    #include <sys/stat.h> 
    #include <fcntl.h> 
    #include <unistd.h> 
    #include <errno.h> 
    int main(int arg, char *argv[]) 
    { 
        char c ; 
        char *data; 
        int numOfWs = 0 ; 
        int numOfPr = 0 ; 
        int numberOfCharacters; 
        int sizeOfBlock ; 
        int nread ; 
        int i=0; 
        int k; 
        float wsP = 0; 
        float prP = 0; 
        sizeOfBlock = atoi(argv[3]) ; 
        data = malloc(sizeOfBlock*sizeof(char)); 
        int fd = open(argv[2], O_RDONLY); 
        while((nread = read(fd, data, sizeOfBlock)) > 0) 
        { 
         numberOfCharacters += nread ; 
         for (i = 0; i < nread; ++i) 
         { 
          c = data[i] ; 
          if(isprint(c)) 
           numOfPr ++ ; 
          else if(isspace (c)) 
           numOfWs ++ ; 
         } 
        } 
        wsP = (numOfWs/(float)numberOfCharacters)*100; 
        prP = (numOfPr/(float)numberOfCharacters)*100 ; 
        printf("%d printable characters out of %d bytes, %.2f%c\n", numOfPr,numberOfCharacters,prP,'%'); 
        printf("%d whitespace characters out of %d bytes, %.2f%c\n", numOfWs,numberOfCharacters,wsP, '%'); 
        exit(0); 
    } 
    
  2. Скопируйте весь файл в память с помощью mmap(), а затем начать читать из памяти:

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <fcntl.h> 
    #include <unistd.h> 
    #include <sys/types.h> 
    #include <sys/mman.h> 
    #include <sys/stat.h> 
    #include <errno.h> 
    #include <ctype.h> 
    #include <string.h> 
    int main(int arg, char *argv[]) 
    { 
        char c ; 
        int i, numOfWs = 0, numOfPr = 0, numberOfCharacters = 0; 
        char *data; 
        float wsP = 0; 
        float prP = 0; 
        struct stat s; 
        int fp = open("x.txt", O_RDWR); 
        int status = fstat (fp, &s); 
        int size = s.st_size; 
        data = mmap((caddr_t)0, size, PROT_READ, MAP_SHARED, fp,0); 
        for (i=0; i<size; i++){ 
         char c; 
         c = data[i]; 
         if(isspace(c)) 
          numOfWs ++; 
         else if(isprint(c)) 
          numOfPr ++; 
         numberOfCharacters ++ ; 
        } 
        wsP = (numOfWs/(float)numberOfCharacters)*100; 
        prP = (numOfPr/(float)numberOfCharacters)*100 ; 
        printf("%d printable characters out of %d bytes, %.2f%c\n", numOfPr,numberOfCharacters,prP,'%'); 
        printf("%d whitespace characters out of %d bytes, %.2f%c\n", numOfWs,numberOfCharacters,wsP, '%'); 
        close(fp); 
        exit(0); 
    } 
    

когда я че ck эти два пути с одним и тем же файлом (созданный кодом Python). Я получаю два разных ответа для процентов, но количество символов, которые читаются каждый, одинаковы (1000).

Это мой файл, сгенерированный из кода Python (я не знаю, что происходит, когда я скопировал его здесь содержит много управляющих символов):

el*[email protected]%?Sw}Qo~.."tJ^~6,eN8+kq l)*N-1oupE 
)coFKoA0\=|W'{Oezx~^p(B5ZJe!AdYb{Gflv&wwCf8}>3"v*>9\pW8PIs;qpX7RSk<9}&8B$u kNaq(mJK$N-!38?E%8-T,I1zC~0O=}FH* 
x9x6Q%GT_C0j>7:@EG{N ?Eh$?18;Ncy[3 $'ikKs%:A].?e;i4`x"k!VD]}*pw 
?\wE~Vix7^H~[26lsN?_GO$vz3M464S`+h=A([email protected]]q<&<+ hjmehAb-_3*3F8&#iM3p)6T`S9Q\yZwm$U`OHG}02{A)WcVzBR1h}H?qhF:P^-j5AQ1<7FD60j#B#}9Z=}2QReaYy|{Wv<^!yOC/7P}n*[email protected]),=*5]]d a:3J;Y(?D?31$pcrquc#&PB;A[9lV+gJ%WZ6K~A|%^E_\3dM/?"y)BtUtG"3hf}W4,3DrXxTyl\UbWwCbMufqCNWx |hiJ\>43S6tCCS)rEo0.cz5PjgK0_AKN|8'g]byLp9AlrZDuK1OX,Csa}nu&i_p,# 
Wyc{Q 
LA\4:!WSq"ln|Pv.B;+N'h%O;tu(CgIh~OYIXCl+6~nSxBuybP nH:j;t'\vk&p} 
,;3Ny#`Ug!rVbqExY| %BVCD^D~z:L(j8L! @ X4a!KBNCQ4z&3^9[O<fkM-qrOq5F/M*]yyU+-VLdZRtUu 
a"=a b%c~GI|tcC/ 
P'/`t|hZ/2iHd94l"%;4-{)VUw%%3"e%IQ{RAX]NeMcsh&@LziT0)_T"2XADH&NYqa<6,[email protected]&,Gx1mj|t't?7=YtT77r<qi8;|tzi kOAi'dq%+g2 5hY?XTj{F)18.Vd!!$Q{D)}$7XxO)Vi%29*,P"cXkC,M|&brd&-DGF>V4 %N)a"VM+TQ$FI;YiL-0 [email protected]~,o6/a7U2c"eGr\N7^B:'dytlOOS(iy\lhC7vnW,f o;vKUNa 
Hg#u}W4N wUM 

это результат от mmap():

961 printable characters out of 1000 bytes, 96.10% 
39 whitespace characters out of 1000 bytes, 3.90% 

и это результат от chunk reading:

974 printable characters out of 1000 bytes, 97.40% 
26 whitespace characters out of 1000 bytes, 2.60% 

Почему число printable characters отличается, но файл тот же в двух методах?

Я думаю, isspace() не принимает в качестве пробела в режиме chunked и вместо этого считает его printable character.

+0

Вам не нужно передавать символ ''% '', поскольку параметр только использует' %% 'в строке формата. Я не понимаю ваш вопрос, я получаю два разных ответа ... Что вы имели в виду? –

+0

Я думаю, что чтение chunk не занимает пробел '' пустое пространство whrn вызывает 'isspace()' – EmadSmart

+0

@iharob это [мой файл] (http://pastebin.com/NvsPNQwU), сгенерированный из ответов python.the каждого метода [здесь] (http: // pastebin.com/EYxMjBYm) вы увидите различия между ответами для одного и того же файла – EmadSmart

ответ

1

Вы не инициализировали numberOfCharacters до 0 в первой программе.

Это означает, что значение numberOfCharacters является неопределенным, прежде чем

numberOfCharacters += nread ; 

выполняется, это хороший повод, чтобы отделить декларацию от определения.

+0

I edit что вы говорите как здесь, так и в моем коде, но результат по-прежнему остается тем, что я добавил сейчас в моем вопросе. – EmadSmart

+0

@EmadSmart Вы работаете в Windows с помощью MinGW или cygwin? –

+0

нет, я в Linux, и я использую gcc – EmadSmart

1

проблема заключалась в том, что пространства для печати в isprint() я изменить порядок isspace() и isprint() и использовать if()...else if() становится правдой.

+0

You sh ould принять ваш собственный ответ, и, конечно, пробелы печатаются, я просто прочитал эту часть из первой программы и пропустил ее во второй программе. –