Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >在linux上使用c++以块形式读写

在linux上使用c++以块形式读写
EN

Stack Overflow用户
提问于 2012-05-09 19:37:31
回答 3查看 5.4K关注 0票数 7

我有一个ASCII文件,其中每一行都包含一个可变长度的记录。例如

代码语言:javascript
代码运行次数:0
复制
Record-1:15 characters
Record-2:200 characters
Record-3:500 characters
...
...
Record-n: X characters

由于文件大小约为10 in,所以我想用块读取记录。一旦读取,我需要转换它们,将它们写入另一个二进制格式的文件中。

因此,对于阅读,我的第一个反应是创建一个char数组,如

代码语言:javascript
代码运行次数:0
复制
FILE *stream; 
char buffer[104857600]; //100 MB char array
fread(buffer, sizeof(buffer), 104857600, stream);

  1. 是否正确地假设linux将发出一个系统调用并获取整个100 in?
  2. ,因为记录被新行分隔,我逐字符搜索缓冲区中的新行字符并重构每个记录。

我的问题是,这是我应该如何读块,还是有更好的选择来读取数据块和重建每一个记录?是否有其他方法可以在一个调用中从ASCII文件中读取x个可变大小的行?

接下来在写的时候,我也是这样做的。我有一个写字符缓冲区,我将它传递给fwrite,以便在一个调用中写入一整组记录。

代码语言:javascript
代码运行次数:0
复制
fwrite(buffer, sizeof(buffer), 104857600, stream);

更新:如果我使用setbuf(流、缓冲区),其中缓冲区是我的100 my的char缓冲区,那么fget会从缓冲区返回还是导致磁盘IO?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-09 19:53:09

  1. 是的,fread会立刻把整个东西取回来。(假设它是一个常规文件。)但是,除非文件本身是105 MB,否则它不会读取105 MB,而且如果不检查返回值,就无法知道实际读取了多少数据,或者是否有错误。
  2. 使用fgets (参见man fgets)而不是fread。这将为您搜索换行处。

char linebuf1000;FILE *file =.;而(fget(linebuf,sizeof(linebuf),file) { // decode单行}

  • ,则代码存在问题。

char buffer104857600;//太大

如果您试图在堆栈上分配一个大缓冲区(105 MB当然很大),那么它将失败,您的程序将崩溃。如果需要这么大的缓冲区,就必须使用malloc或类似的方法在堆中分配它。我当然会保留单个函数最多几十KB的堆栈使用情况,尽管在大多数股票Linux系统上您可能可以使用几MB。

作为一种选择,您只需将整个文件mmap到内存中即可。在大多数情况下,这不会改善或降低性能,但更容易使用。

代码语言:javascript
代码运行次数:0
复制
int r, fdes;
struct stat st;
void *ptr;
size_t sz;

fdes = open(filename, O_RDONLY);
if (fdes < 0) abort();
r = fstat(fdes, &st);
if (r) abort();
if (st.st_size > (size_t) -1) abort(); // too big to map
sz = st.st_size;
ptr = mmap(NULL, sz, PROT_READ, MAP_SHARED, fdes, 0);
if (ptr == MAP_FAILED) abort();
close(fdes); // file no longer needed

// now, ptr has the data, sz has the data length
// you can use ordinary string functions

使用mmap的优点是您的程序不会耗尽内存。在64位系统上,您可以同时将整个文件放入地址空间(甚至10 GB文件),当程序访问内存时,系统将自动读取新的块。旧块将自动丢弃,如果您的程序再次需要它们,则重新读取它们。

这是一个很好的方式,犁大文件。

票数 6
EN

Stack Overflow用户

发布于 2012-05-09 20:38:16

如果可以的话,您可能会发现对该文件进行mmap操作将是最简单的。mmap将文件的一部分映射到内存中,这样整个文件基本上可以作为字节数组访问。在您的示例中,您可能无法同时映射整个文件--它看起来如下所示:

代码语言:javascript
代码运行次数:0
复制
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>


/* ... */

struct stat stat_buf;
long pagesz = sysconf(_SC_PAGESIZE);
int fd = fileno(stream);
off_t line_start = 0;
char *file_chunk = NULL;
char *input_line;
off_t cur_off = 0;
off_t map_offset = 0;
/* map 16M plus pagesize to ensure any record <= 16M will always fit in the mapped area */
size_t map_size = 16*1024*1024+pagesz;
if (map_offset + map_size > stat_buf.st_size) {
  map_size = stat_buf.st_size - map_offset;
}
fstat(fd, &stat_buf);
/* map the first chunk of the file */
file_chunk = mmap(NULL, map_size, PROT_READ, MAP_SHARED, fd, map_offset);
// until we reach the end of the file
while (cur_off < stat_buf.st_size) {
  /* check if we're about to read outside the current chunk */
  if (!(cur_off-map_offset < map_size)) {
    // destroy the previous mapping
    munmap(file_chunk, map_size);
    // round down to the page before line_start
    map_offset = (line_start/pagesz)*pagesz;
    // limit mapped region to size of file
    if (map_offset + map_size > stat_buf.st_size) {
      map_size = stat_buf.st_size - map_offset;
    }
    // map the next chunk
    file_chunk = mmap(NULL, map_size, PROT_READ, MAP_SHARED, fd, map_offset);
    // adjust the line start for the new mapping
    input_line = &file_chunk[line_start-map_offset];
  }
  if (file_chunk[cur_off-map_offset] == '\n') {
    // found a new line, process the current line
    process_line(input_line, cur_off-line_start);
    // set up for the next one
    line_start = cur_off+1;
    input_line = &file_chunk[line_start-map_offset];
  }
  cur_off++;
}

最复杂的是避免太大的映射。您可能可以使用

代码语言:javascript
代码运行次数:0
复制
char *file_data = mmap(NULL, stat_buf.st_size, PROT_READ, MAP_SHARED, fd, 0);
票数 2
EN

Stack Overflow用户

发布于 2012-05-09 19:53:41

我的观点是使用fgets(buff)自动检测新线路。

然后使用strlen(buff)来计算缓冲区大小,

代码语言:javascript
代码运行次数:0
复制
if( (total+strlen(buff)) > 104857600 )

然后用新的块写..。

但是这个块的大小几乎不可能是104857600字节。

CMIIW

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10527187

复制
相关文章
ClassNotFoundException
ClassNotFoundException:org.springframework.web.con text.ContextLoaderListener
the5fire
2019/02/28
9340
rpc 报错 ClassNotFoundException
rpc发送Request对象报错 java.lang.ClassNotFoundException
Antler
2019/01/06
9220
ClassNotFoundException v/s NoClassDefFoundError
在这个小节里,我们讨论一下ClassNotFoundException与NoClassDefFoundError的区别。
Erossssssss
2021/04/09
1.3K0
ClassNotFoundException v/s NoClassDefFoundError
理解ClassNotFoundException与NoClassDefFoundError的区别
但是你知道他们的区别吗?以及什么情况下发生上面的异常? 如果你还不清楚,那么不着急,我们来仔细分析一下:
我是攻城师
2018/10/19
9.3K0
理解ClassNotFoundException与NoClassDefFoundError的区别
NoClassDefFoundError 和 ClassNotFoundException异常
1.简介 ClassNotFoundException和NoClassDefFoundError是当JVM无法找到classpath请求的类发生。
FHAdmin
2021/08/04
1.1K0
ClassNotFoundException,NoClassDefFoundError,NoSuchMethodError排查
在使用java开发的过程中时常会碰到以上三个错误,其中NoClassDefFoundError、NoSuchMethodError两个error遭遇得会多一些。本文会简单分析三个异常发生的原因,并给出排查思路和相关工具。
LNAmp
2018/09/05
2K0
Intellij IDEA 启动项目ClassNotFoundException
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
程序新视界
2022/11/30
1.2K0
Intellij IDEA 启动项目ClassNotFoundException
查看本机IP
有时候,在登录到云服务器之后,可能需要在终端查询该服务器的ip。 之前我都是用的 ip.cn ,但是感觉不行了。 现在提供一些其他的可选择项: $ curl ipinfo.io { "ip": "60.205.205.243", "city": "", "region": "", "country": "CN", "loc": "34.7725,113.7270", "org": "AS37963 Hangzhou Alibaba Advertising Co.,Ltd." } $
魔王卷子
2019/05/31
7.1K0
异常:java.lang.ClassNotFoundException
如图: 说明缺少相应的包(或者类),上图就是缺少commons-logging-1.2的jar包,导入即可 补充,在maven项目中, 可能是版本不兼容, 因为不同版本相关的jar内里面的类可能不同,
时间静止不是简史
2020/07/27
7480
异常:java.lang.ClassNotFoundException
ClassNotFoundException和NoClassDefFoundError的区别
最近看到一个面试题,问ClassNotFoundException和NoClassDefFoundError的区别。平时没有专门思考过这个问题,藉此机会分析一下。
明明如月学长
2021/08/27
1.6K1
ClassNotFoundException解决方案总结
ClassNotFoundException:类找不到异常。首先看你的logcat中是否显示Caused by : java.lang.ClassNotFoundExcetion..
fanfan
2022/05/07
5.2K0
ClassNotFoundException解决方案总结
ClassNotFoundException 和 NoClassDefFoundError 的区别
Java 面试中有个很常见的问题:请对比 Exception 和 Error,另外一个,“运行时异常” 与 “一般异常” 有什么区别? 今天在看 「极客时间」的 《Java 核心技术 36 讲》 中又有提到。 大家都熟悉的典型回答: Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。 Exception 和 Error 体现了 Java 平台设计者
阿凯
2018/06/29
6.6K0
Android使用MultiDex发生ClassNotFoundException
在Method与Filed数超限的背景下,我们将多工程拆分成多个Dex打到Apk中解决该问题,但是在使用MultiDex的时候,还会遇到一些问题。 在启动的时候会发生如下Crash。 在4.4以下会Crash,而5.0以上则不会发生Crash
None_Ling
2018/10/24
1.9K0
AMD的规范演化
对于web项目来说,打交道的不仅仅有后台,前台页面也是少不了的,而前台的页面js也常常是我们后台程序员必须要使用的语言, 今天说下项目中的js的组织方式。
付威
2018/12/04
7270
应用架构演化进程
那么应用架构主要有哪些阶段呐?这里作者凭着自己的理解粗糙的讨论一下。算是对这个问题的一种探索吧!
写一点笔记
2022/08/11
3460
hudi 模式演化
模式演化是数据管理的一个非常重要的方面。 Hudi支持常见的模式演变场景,比如添加一个空字段或提升一个字段的数据类型,开箱即用。 此外,该模式可以跨引擎查询,如Presto、Hive和Spark SQL。 下表总结了与不同Hudi表类型兼容的模式更改类型。
从大数据到人工智能
2022/01/19
4500
【演化计算】Evolutionary Forest——基于演化算法的自动特征工程框架
在传统的机器学习领域,构建鲁棒且有意义的特征可以显著改善最终模型的性能。尤其是随着深度学习的发展,特征自动构建已经不再是一件新鲜事。但是,在传统机器学习领域,尤其是数据量不足的时候,基于深度学习的特征构建算法往往难以取得满意的效果。此外,深度学习的黑盒特性也影响了深度学习算法在金融和医疗领域的应用。因此,本文旨在探索一种新的基于演化算法的自动特征构建算法(Evolutionary Forest)在特征工程方面的效果。为了简单起见,我选择了scikit-learn包中的一个问题作为案例研究问题。这项任务被称为“diabetes”,其目标是预测一年后该疾病的进展情况。
演化计算与人工智能
2021/06/10
7940
ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
进入workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
程裕强
2022/05/06
4360
ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
PHP-MVC演化
2、将上一讲的MyPDO类拷贝到站点下,改名为MyPDO.class.php,这个文件中只存放MyPDO类
cwl_java
2020/03/28
6640
查看本机IP的方法
1. 打开网络和共享中心 2.更改适配器设置 3. 右键选择 状态 4.选择详情 5.找到IP
微风-- 轻许--
2020/04/08
17.6K0
查看本机IP的方法

相似问题

反应本机反应-本机反应

26

React本机崩溃ClassNotFoundException

17

本机反应-“反应-本机-资产”未被识别

15

反应-本机-反应-本机更新-等级-错误

10

反应本机,反应-本机init AwesomeProject,反应-本机运行-ios:错误

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文