read()函数

cin读入很方便,但是在一些大数据的情况会非常慢,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。这时候一般有三种方法
1. 用scanf()
2. 关闭和stdio同步。

ios::sync_with_stdio(false);

这种方法让cin读入速度和scanf差不多
文件开头用了之后就可以放心用cin了
3. 自定义函数read()/fread();
这次我主要讲read()/fread();

const int MAXN = 10000000;  
const int MAXS = 60*1024*1024;  

int numbers[MAXN];  
char buf[MAXS];  

void fread_analyse()  
{  
    freopen("data.txt","rb",stdin);  
    int len = fread(buf,1,MAXS,stdin);  
    buf[len] = '\0';  
    analyse(buf,len);  
}  
const int MAXN = 10000000;  
const int MAXS = 60*1024*1024;  

int numbers[MAXN];  
char buf[MAXS];  

void read_analyse()  
{  
    int fd = open("data.txt",O_RDONLY);  
    int len = read(fd,buf,MAXS);  
    buf[len] = '\0';  
    analyse(buf,len);  
}  

打个比方,有人cin,scanf,read();分别读了10000000个数据,
cin是6.38秒;
关了同步之后是2.05秒;
scanf是2.01秒
而令人惊讶read()/fread()只用了0.29秒!
所以在以后读大数据之后一般应多用用read();

在Linux系统中,read()函数是一个用于从文件描述符(file descriptor)中读取数据的系统调用函数。其函数原型如下: ``` ssize_t read(int fd, void *buf, size_t count); ``` 其中,参数fd是要读取的文件描述符,参数buf是用于存储读取数据的缓冲区地址,参数count是要读取的最大字节数。read()函数会尝试从文件描述符中读取count个字节的数据,并将读取的数据存储到buf中。函数返回实际读取到的字节数,如果返回-1表示读取失败。 需要注意的是,read()函数是一个阻塞函数,即当没有数据可读时,该函数会一直阻塞等待,直到有数据可读或者出现错误为止。如果要使用非阻塞的方式读取数据,可以使用fcntl()函数将文件描述符设置为非阻塞模式。 以下是一个使用read()函数读取文件内容的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s <filename>\n", argv[0]); return 1; } int fd = open(argv[1], O_RDONLY); if (fd < 0) { printf("Failed to open file %s!\n", argv[1]); return 1; } char buffer[1024]; ssize_t nread; while ((nread = read(fd, buffer, sizeof(buffer))) > 0) { if (write(STDOUT_FILENO, buffer, nread) != nread) { printf("Failed to write!\n"); return 1; } } if (nread < 0) { printf("Failed to read file!\n"); return 1; } close(fd); return 0; } ``` 该程序首先打开指定的文件,并将文件描述符fd传递给read()函数进行读取。在循环中,每次最多读取sizeof(buffer)个字节的数据,并将读取的数据写入标准输出。当read()函数返回0时,表示文件已经读取完毕,可以退出循环。如果读取失败,程序会输出错误信息并退出。最后需要使用close()函数关闭文件描述符fd。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值