我需要转换一个包含数百万'零的字符串。或者'一个'布尔数组中的字符(特定的1039680个字符)。我现在拥有它的方式需要几秒钟才能获得300000个字符串,这太长了。我需要能够在不到一秒的时间内完成整个魔法角色转换。
我尝试这样做的方法是读取一行(在此试用案例中)300000个零的文件。
我知道我的代码对包含除零或一些以外的东西的字符串起作用时,但我知道字符串只包含那些。
我也看过atoi,但我认为它不适合我的需要。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define BUFFERSIZE 1039680
int main ()
{
int i ;
char buffer[BUFFERSIZE];
bool boolList[BUFFERSIZE] ;
// READ FILE WITH A LOT OF ZEROS
FILE *fptr;
if ((fptr=fopen("300000zeros.txt","r"))==NULL){
printf("Error! opening file\n");
exit(1);
}
fscanf(fptr,"%[^\n]",buffer);
fclose(fptr);
// CONVERT STRING TO BOOLEAN ARRAY
for (i=0 ; i<strlen(buffer) ; i++) {
if (buffer[i] == '1') boolList[i] = 1 ;
}
return 0;
}
答案 0 :(得分:4)
尝试
char *sptr = buffer;
bool *bptr = boolList;
while (*sptr != '\0')
*bptr++ = *sptr++ == '1'? 1:0;
答案 1 :(得分:2)
如果字符串长度总是像你说的1039680个字符那么为什么你在代码中使用strlen(buffer)
?为什么不循环BUFFERSIZE
次?你应该像其他人一样缓存结果,而不是一次又一次地调用它。
更重要的是,你没有在缓冲区中包含NULL终止字节的空间,所以当你读取精确的BUFFERSIZE
个字符时,char数组不是一个有效的NULL终止字符串,因此在它上面调用strlen会调用<强>未定义的行为
如果要将文件作为文本读取,请将另外一个字符添加到缓冲区
char buffer[BUFFERSIZE + 1];
否则,将文件作为二进制文件打开,并立即读取整个1039680字节块。那会更快
fread(buffer, sizeof(buffer[0]), BUFFERSIZE, fptr);
然后只循环BUFFERSIZE
个字节并将其设置为0而不使用分支
for (i = 0 ; i < BUFFERSIZE; i++)
{
buffer[i] -= '0';
}
您不需要其他boolList
,只需将buffer
用作boolList
或将名称更改为boolList
并弃用缓冲区