Я хочу прочитать файл с несколькими символами в нем и проверить процент печатаемых символов, а также процент белых пробелов. Это мой 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()
Я хочу, чтобы мой файл, чтобы иметь как печатаемые символы и пробелы и другие символы (которые не находятся в этих двух группах). я сделать это двумя способами:
Прочитайте файл, кусок на кусок, с
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); }
Скопируйте весь файл в память с помощью
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
.
Вам не нужно передавать символ ''% '', поскольку параметр только использует' %% 'в строке формата. Я не понимаю ваш вопрос, я получаю два разных ответа ... Что вы имели в виду? –
Я думаю, что чтение chunk не занимает пробел '' пустое пространство whrn вызывает 'isspace()' – EmadSmart
@iharob это [мой файл] (http://pastebin.com/NvsPNQwU), сгенерированный из ответов python.the каждого метода [здесь] (http: // pastebin.com/EYxMjBYm) вы увидите различия между ответами для одного и того же файла – EmadSmart