-
2021-05-25 09:01:34
fwrite(buffer, size, count,fp):以二进制的形式向指定的文件中写入若干数据项(由count决定),返回实际写入的数据项数目,各参数含义如下:
buffer:一个存储区的起始地址,以该地址开始的存储区的数据即是保存到文件中的数据,可以是数组或指针类型;
size:单个数据项的大小(单位:字节);
count:数据项数量;
fp:FILE类型指针,该指针对应的文件即是数据保存的“目的地”;
#include #include int main(){
struct Student{
char name [10];
int num;
int age;
char addr [30];
} stud [10];
FILE * output = fopen("D:\\stud.dat","wb");//生成的stud.dat文件无法用记事本打开,打开后显示“乱码”。
if(output == NULL){
printf("无法打开文件");
exit(0);
}
for(int i=0;i<10;++i){
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
fwrite(&stud[i],sizeof(struct Student),1,output);
}
fclose(output);
return 0;
}
fread(buffer, size, count,fp):以二进制的形式从指定的文件中读取若干数据项(由count决定),调用成功返回实际读取到的数据项个数(小于或等于count),不成功或读到文件末尾返回 0,各参数含义如下:
buffer:一个存储区的起始地址,以该地址开始的存储区用于保存从文件中读取出来的数据,可以是数组或指针类型;
size:单个数据项的大小(单位:字节);
count:数据项数量;
fp:FILE类型指针,该指针对应的文件即是数据的“来源地”;
#include #include int main(){
struct Student{
char name [10];
int num;
int age;
char addr [30];
} stud [10];
FILE * input = fopen("D:\\stud.dat","rb");
if(input == NULL){
printf("无法打开文件");
exit(0);
}
for(int i=0;i<10;++i){
fread(&stud[i],sizeof(struct Student),1/*读取1个数据项*/,input);
printf("%s %d %d %s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
fclose(input);
return 0;
}
#include #include int main(){
struct Student{
char name [10];
int num;
int age;
char addr [30];
} stud [5];
FILE * input = fopen("D:\\stud.dat","rb");
if(input == NULL){
printf("无法打开文件");
exit(0);
}
int validCount;//实际读取多少数据项
while((validCount = fread(stud,sizeof(struct Student),5/*最多读取5个数据项*/,input))!=0){
for(int i=0;i
更多相关内容 -
MFC读取二进制文件并保存为文本文件
2013-09-04 17:59:051:本程序读取二进制文件,并把读到的二进制文件保存为文本数据 2:二进制文件内容一系列的三维点云数据,由扫描仪器扫描获得 3:本程序采用了多线程技术,读取二进制文件时,界面不会卡顿 4:实例二进制文件为data.... -
富文本编辑器上传到本地可以转二进制存数据库.rar
2020-06-11 10:14:55ueditor修改版,上传图片直接保存到想要的位置,不再是项目中,添加图文内容直接转为二进制存储数据库方法,直接在页面显示,不需要任何处理。 -
Java实现较大二进制文件的读、写方法
2020-08-31 08:45:29本篇文章主要介绍了Java实现较大二进制文件的读、写方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
二进制文件和文本文件区别-小白笔记
2020-12-30 14:50:26不同的二进制文件需要不同的软件来打开,例如BMP文件,需要一个读图的软件来打开才能看到里面保存的图像,MP3文件需要一个播放器软件才能听到里面的音频。而文本文件只需要记事本就可以打开查看里面的内容。 2 ...1 视图形式
不同的二进制文件需要不同的软件来打开,例如BMP文件,需要一个读图的软件来打开才能看到里面保存的图像,MP3文件需要一个播放器软件才能听到里面的音频。而文本文件只需要记事本就可以打开查看里面的内容。
2 存储形式
二进制文件里存储的东西是二进制数据,就是01串。而文本文件中存储的是字符串,比如汉字。这点是从逻辑层面上所说的,不完全正确,但是便于理解,下面我会进阶的细说这里。
3 性能
二进制文件的读写速度非常快,因为它就是将数据在内存中的存储形式(二进制)原模原样放到文件中,读出来的东西不需要经过处理就可以直接放到内存中去用,但是这些二进制串我们是看不懂也处理不了的,所以就需要专门的解码软件来处理,才能将信息显现到我们面前,所以说二进制文件的读写比较快,但是对于我们程序员来说,可读性差。
而文本文件首先有一个编码方式,例如ASCII或者Unicode,当我们要存一些东西时,会先用一定的编码方式将这些东西转为对应的编码,再将这个编码写进文件里,读的时候要先解码,才能将对应的字符显示出来,所以读写比较慢,但是读出来的东西是字符串,我们能看懂,可读性比较好。
4 拓展
再详细说一下文本文件的存储过程:数据在内存中都是以二进制存储的,所以要先从内存中将数据的二进制取出来,用ASCII(或Unicode)编码方式将其编码,再将这个编码存进文件中。特别有趣的地方就是:如果这些数据是字符,那么他们在内存中本身就是按ASCII码编好的,所以存进文件文件时不需要再进行编码了,也是原模原样将内存中的东西放进了文件中(与二进制文件存储方式一样是不是?)。但如果不是字符型数据,例如int i=10,他在内存中存的是10的二进制:1010,这个二进制经过ASCII编码之后,再解码出来肯定就不是10了。
这就解释了为什么用记事本打开二进制文件时会乱码的问题。首先记事本也是一种解码软件,但他是按ASCII或者Unicode来解码的,他会按自己的方式给二进制文件来解码并显示字符。所以用记事本打开二进制文件时,也不会全部乱码,仔细看那些用字符串形式存的数据肯定不会乱码。
刚才说了在逻辑层面上:文本文件存的是字符,二进制文件存的是二进制数据。其实在物理层面上讲,我们的硬盘只能存储二进制。所以广义上讲文本文件也是二进制文件,只不过文本文件里只能存字符型数据,而字符型数据经过ASCII或Unicode解码之后我们能看懂。
换一个角度想,所有二进制文件在硬盘上都是01串,我们都看不懂,所以需要一个解码软件将这堆二进制转换成我们想要的信息形式。所以这时就回到了文本文件和二进制文件的最表象区别:解码软件不同!用记事本打开二进制文件会乱码,而二进制的解码软件基本都打不开文本文件。
5 总结
在实际存储中最好是将数据分成字符数据和非字符数据两类:
如果存储的是字符数据,无论采用文本文件还是二进制文件都是没有任何区别的,这点上面解释过了。
如果存储的是非字符数据,那么就要看我们使用的情况来决定:
1、如果是需要频繁的保存和访问数据,那么应该采取二进制文件进行存放,这样可以节省存储空间和转换时间。
2、如果需要频繁的向终端显示数据或从终端读入数据,那么就将这些数据转为字符串型,采用文本文件进行存放,这样可以节省转换时间。
-
文本读写与二进制读写 速度对比 Python Matlab
2022-03-01 21:30:07文本读写与二进制读写 速度对比 Python Matlab文本读写与二进制读写 速度对比 Python Matlab
引言
数据读写的速度往往会占用大量的时间,因此对Python和Matlab中不同的数据输出方式的速度进行了简单对比。
这是因为最近在写代码的过程中遇到一个问题,需要跨进程进行数据传输,但是目前还不太会使用共享内存,因此使用了较为传统的方式:一个程序将数据保存为文件,之后另一个程序进行读取,但是发现耗时较为严重,所以试图通过一些方法进行提速。
Python
对比方法
以大量的浮点数存储到文件中的任务进行测试。
首先对比Python中不同方法进行测试。
方式一:将浮点数转换成字符串,然后存储到文件中。
方式二:通过struct模块将数据转化为二进制,然后以二进制的方式写入文本。
方式三:将数据存放在Numpy的array中,通过tofile()函数直接进行二进制存储。
测试的完整代码如下:
import sys import random import time import struct import numpy as np from array import array def generate_random(n): random.seed(10) data = np.zeros(n) for i in range(n): data[i] = random.random() return data def save_text(data): timest = time.time() filename = '1.mac' f = open(filename,'w') for i in data: a = '%.6f' % i f.write(a) f.close() timeend = time.time() print(timeend - timest,"存入文本 用时") return 0 def save_binary(data): '通过struct 打包进行读写' timest = time.time() filename = '2.mac' f = open(filename,'wb') for i in data: a = struct.pack('d', i) f.write(a) f.close() timeend = time.time() print(timeend - timest, "struct 二进制 用时") return 0 def numpytofile(data): '直接使用numpy里的tofile' timest = time.time() arr = data arr.tofile("3.bin") timeend = time.time() print(timeend - timest, " numpy 二进制 用时") return 0 def main(argv): # 对不同的写数据的方式进行对比 data = generate_random(1000000) save_text(data) save_binary(data) numpytofile(data) if __name__ == '__main__': main(sys.argv[1:])
测试结果
对100w个随机生成的浮点数进行测试。
三种方法的耗时如下:
0.4208517074 方法1:存入文本 用时
0.1994802951 方法2:struct 二进制 用时
0.0029914379 方法3:numpy 二进制 用时从耗时结果来看,在存储同样的数据时,不同存储方式耗费的时间相差较大,其中以numpy的方式速度最快,且快进百倍。三种方法的对比如下表
方法 耗时(s) 优点 缺点 方法一 0.420851 输出的文件可读 速度最慢,会丢失浮点数的精度 方法二 0.199480 - - 方法三 0.002991 输出速度最快,精确存储浮点数的值 无法直接看到数据值 Matlab
对比方法
Matlab中也有多种数据输出方式。简单对比了两种方法:
方法一:使用dlmwrite函数
方法二:二进制方式输出
% 注释 rng('default') arr = rand(100000,1); % 方法一 使用dlmwrite函数输出 tic dlmwrite('method1.txt',arr) toc t1 = toc; % 方法二 使用二进制的方式输出 tic fid = fopen('method2.bin','wb'); fwrite(fid,arr,'float64'); fclose(fid); toc t2 = toc;
测试结果
方法一:历时 1.449960 秒。 方法二:历时 0.001632 秒。 在输出10w 个浮点数时,其运行速度之比约 1.449/0.00163 = 888 倍
总结
从以上对比情况来看,合理的二进制读写可以在很大程度上提升数据的存储速度,并保证数据准确。该方法可显著提升数据的传递效率。
-
python 读取二进制 显示图片案例
2020-09-17 12:29:07主要介绍了python 读取二进制 显示图片案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
使用mysqlbinlog把mysql二进制文件转换文本
2021-01-19 16:49:20mysql有以下几种日志: 错误日志: -log-err 查询日志: -log 慢查询日志: -log-slow-queries 更新日志: -log-update 二进制日志: -log-bin 在mysql的安装目录下,打开my.ini,在后面加上上面的参数,保存后重启...MYSQL启用日志
[root@jianshe99]# whereis my.ini
[root@jianshe99]# vi /etc/my.cnf
[mysqld] datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
[mysqld_safe] log-error=/var/log/mysqld.log
long_query_time =1
log-slow-queries=slowqueris.log
log-queries-not-using-indexes = nouseindex.log
log=mylog.log
pid-file=/var/run/mysqld/mysqld.pid
——————————————————–
查看日志
是否启用了日志
mysql>show variables like ‘log_bin’;
怎样知道当前的日志
mysql> show master status;
看二进制日志文件用mysqlbinlog
shell>mysqlbinlog mail-bin.000001
或者shell>mysqlbinlog mail-bin.000001 | tail
Windows 下用类似的命令。
mysql有以下几种日志:
错误日志: -log-err
查询日志: -log
慢查询日志: -log-slow-queries
更新日志: -log-update
二进制日志: -log-bin
在mysql的安装目录下,打开my.ini,在后面加上上面的参数,保存后重启mysql服务就行了。
LAST_UPDATED2
————————————————————-
如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一个指定的时间点的数据。关于启用二进制日志的信息,参见5.11.3节,“二进制日志”。对于 mysqlbinlog的详细信息,参见mysql手册8.6节,“mysqlbinlog:用于处理二进制日志文件的实用工具”。
要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径。如果未包含在选项文件中,当服务器启动时,可以在命令行中以选项的形式给出。启用二进制日志的选项为– log-bin。要想确定当前的二进制日志文件的文件名,输入下面的MySQL语句:
SHOW BINLOG EVENTS G
你还可以从命令行输入下面的内容:
mysql –user=root -pmy_pwd -e ‘SHOW BINLOG EVENTS G’
将密码my_pwd替换为服务器的root密码。
1. 指定恢复时间
对于MySQL 4.1.4,可以在mysqlbinlog语句中通过–start-date和–stop-date选项指定DATETIME格式的起止时间。举例说明,假设在今天上午10:00(今天是2005年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入:
mysqlbinlog –stop-date=”2005-04-20 9:59:59″ /var/log/mysql/bin.123456
| mysql -u root -pmypwd
该命令将恢复截止到在–stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要恢复后面发生的活动。根据这些,你可以用起使日期和时间再次运行mysqlbinlog:
mysqlbinlog –start-date=”2005-04-20 10:01:00″ /var/log/mysql/bin.123456
| mysql -u root -pmypwd
在该行中,从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。
-
java 将文件中二进制文件转换成文本文本文件并输出
2012-05-03 14:59:14读取文件中的二进制文件并将二进制转换成文本文档并输出 -
二进制文件与文本文件详解
2019-11-27 22:50:22二进制文件 定义: 二进制文件就是把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放,即存放的是数据的原形式。 读取流程: 用记事本打开二进制文件的流程是怎样的呢?记事本无论打开什么文件都按既定... -
Python:将二进制字符串转换为文本文件
2020-12-01 08:20:34如果将其限制为设置的位长度(如仅8位),则可以填充二进制文件,然后就可以知道字符大小。如果你不想这样做,你需要别的办法。这里有一个方法,它不关心处理空格、emojis等的输入。它是通过用空格分隔二进制文件中的字符... -
二进制文件和文本文件的存储大小的区别及计算方式
2021-03-23 15:17:41二进制文件和文本文件的存储过程是不一样的。 一般来说,二进制文件要小于文本文件的。 1.二进制文件存储: 二进制文件存储不用符号什么的隔开,直接数与数紧挨在一起。比如10, 12的存储需要4个字节。存10的时候,... -
Numpy二进制文件、文本文件的保存与读取
2020-12-24 17:28:52一:二进制文件 概念:如果一个文件的后缀是 .npy / .npz 则为一个二进制文件 二进制文件生成 np.save(“file_name”,array) 注:save默认保存的为.npy文件,file_name可不加后缀,且只能保存一个数组 arr1 = np.... -
(C++)文本文件以及二进制文件的读写操作
2020-08-30 12:06:58目录文件的读写一、文本文件——写文件...2.二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂他们 操作文件的三大类: 1.ofstream:写操作 2.ifstream:读操作 3.fstream :读写操作 一、 -
打开文件、文本文件的读写、二进制文件的读写
2021-04-09 12:32:54一、打开文件 文件的操作步骤: • 打开文件 • 对文件进行各种操作(读、写)然后保存...• 一种 二进制文件(图片 mp3 视频…) open()打开文件时,默认是以文本文件的形式打开的。 1、open()函数 open(file, mode=‘r’, -
二进制文件与文本的区别
2011-03-08 20:34:03总结介绍了二进制文件与文本文件的区别于联系。 -
使用Python进行二进制文件读写的简单方法(推荐)
2020-11-28 08:17:42如何用python生成和读取二进制文件可以使用numpy.fromfile(),也可以使用open(filename, 'rb'),其中的'b'就是二进制的意思,然后使用文件类型的read方法,读取一些字节,再用struct.unpack()方法来解析二进制。... -
二进制文件与文本文件的区别
2017-05-03 16:27:48文本文件和二进制文件的定义: 计算机在物理内存上面存放的都是二进制,所以文本文件和二进制文件的主要区别是在逻辑上的而不是物理上的。而从文件的编码方式来看,文件可以分为文本文件和二进制文件。文本文件... -
二进制文件、文本文件
2018-08-11 14:19:21二进制文件和文本文件都是按照二进制存储的,只不过文本文件是把一个字节一个字节解读成字符,而二进制文件可以任意定义解读方式。 在windows上,用记事本就可以打开文本文件了,但要打开二进制文件需要对应的二... -
二进制-文本互转工具
2010-11-26 15:03:00文本转二进制的时候可以通过文件和输入文本框两种方式,在即选择了文件同时又输入了文本框内容则程序优先使用文本框内容作为转换依据,转换后的二进制保存为文件形式。接受的文本要求为一个字节的2个字符中间不能有... -
详解二进制文件和文本文件的区别暨换行和回车详解
2021-05-24 07:16:40/*以写方式打开二进制文件*/FILE *fp = fopen("test.txt","wb");二者的根本区别在哪儿?答案是:二者唯一的区别就在于对换行符的处理上。2. 换行符和回车符历史:在计算机还没有出现之前,有... -
转换文本数字为二进制并保存
2012-04-20 11:04:41转换文本数字为二进制并保存的例程,可转换整数、浮点数、单精度、双精度,VC6.0编译通过。 -
二进制文件和文本文件的区别
2017-04-10 22:19:10文本文件与二进制文件的定义 文本文件:是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。 二进制文件:是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以... -
如何在python3中将二进制文件转换为列表中的文本文件?
2020-11-28 12:47:58我正在尝试编写一个Python程序,它从LabView获取多个二进制文件,从tkinter对话框中选择并打开,然后将它们转换为可读的文本文件(最好是csv文件)。但是,我在二进制到文本的转换上遇到了问题。在我试过看binascii... -
c#二进制读取文件与文本转换
2020-06-25 16:06:43//将文件读取为流格式 Stream expectedSteam = new FileStream(scriptpath, FileMode.Open, FileAccess.Read); //创建Byte数组 byte[] bl = new byte[expectedSteam.Length]; //读取流文件字节,保存到对象...//二进制 -
二进制文件和文本文件
2021-08-15 15:33:46计算机文件分为两种:二进制文件和ASCII(也称纯文本文件) 在windows上,用记事本就可以打开文本文件了,但要打开二进制文件需要对应的二进制文件解码器,因此,文本文件是更为大家所熟知的文件形式,而二进制文件... -
二进制文件的读写
2021-06-06 16:32:47C++可以读写文本类型的文件,同理也可以读写二进制类型的文件,虽然存储的内容可能无法直接通过双击打开的方式,但通过二进制的方式读取可以正常的展示 #include <iostream> #include <fstream> 首先引入... -
二进制文件和文本文件到底有什么不同?(二)
2022-03-31 03:10:232)二进制文件:这类文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像、声音等等。 C++标准库提供了基于输入/输出... -
易语言源码整数型到二进制文本.rar
2020-02-16 21:09:41易语言源码整数型到二进制文本.rar 易语言源码整数型到二进制文本.rar 易语言源码整数型到二进制文本.rar 易语言源码整数型到二进制文本.rar 易语言源码整数型到二进制文本.rar 易语言源码整数型到二进制文本....