c++&python&JAVA 读写二进制&文本文件

c++读写文本文件

// 写
std::ofstream fout("a.txt");
int nNum = 20;
std::string str("hello");
fout << nNum << "," << std << std::endl;
fout.close()

// 读文本文件
std::ifstream fin("a.txt");
int nNum;
char szBuf[256] = {0};

fin >> nNum >> szBuf;
fin.close();

c++读写二进制文件

#include 

// 写二进制
std::ofstream fout("data.dat", std::ios::binary);
int nNum = 20;
int a[5] = {1, 2, 3, 4, 5};
std::string str("hello, world");

fout.write((char*)&nNum, sizeof(int));
fout.write(reinterpret_cast<const char*>(a), sizeof(int)*5);
fout.write(str.c_str(), sizeof(char)*(str.size()));
fout.close();

// 读二进制文件
std::ifstream fin("data.dat", std::ios::binary);
int nNum;
int b[5];
char szBuf[256] = {0};

fin.read((char*)&nNum, sizeof(int));
fin.read(reinterpret_cast<char*>(b), sizeof(int)*5);
fin.read(szBuf, sizeof(char) * 256);
fin.close();

参考:C++读写二进制文件

// 获取文件的大小
ifstream fin;
fin.open("test.jpg", ios::binary | ios.ate);
long size = fin.tellg();

参考:[C++]读写二进制文件和文本文件

python读写文本文件

f = open('test.txt')
f.read()
f.close()

f.readline() # 整行读取数据,若没读取到数据则返回空
f.readlines() # 将文件内容以列表形式存放
f.next() # 和f.readline()相似,逐行读取数据,若没读取到数据则报错

# 写入txt, 文件如果存在会先清空再写入
f = open('test.txt', 'w', buffering=1) # 行缓冲,python3文本读写不能使用无缓冲,但二进制写可以使用buffering=0
f.write('hello')
f.close()

f.writelines(['\nhello dear!', '\nhello baby!']) # 多行写入

参考:Python读写txt文本文件

python读写二进制文件

  • np.save & np.load 将数组以未压缩的原始二进制格式保存在扩展名为 npy 的文件中
np.save('name.npy', data)
data = np.load('name.npy')
  • tofile & fromfile 读写二进制文件。文件后缀名没有要求,且读取数据需要指定 dtype ,需要与保存时的类型一致。
data.tofile("data.bin")
data = np.fromfile("data.bin", dtype=np.float32)

参考:Numpy数组的保存与读取

JAVA写二进制文件

  • 注意需要放在try-catch里,否则会报错unhandled exception: java.io.filenotfoundexception
public static void writeFile(String path, String fileName, byte[] content)
		throws IOException {
	try {
		File f = new File(path);
		if (!f.exists()) {
			f.mkdirs();
		}
		FileOutputStream fos = new FileOutputStream(path + fileName);
		fos.write(content);
		fos.close();
	} catch (IOException e) {
		throw new RuntimeException(e);
	}
}

参考:
[1] JAVA文件工具类之——文件写入(byte数组、String方式、url写入方式)

JAVA获取png的图像数据并以rgbrgb格式存储为byte数组

FileInputStream img = new FileInputStream("img.png");
Bitmap bitmap = BitmapFactory.decodeStream(img);
int[] pixels = new int[width * height]; 
byte[] data = new byte[width * height * 3];

bitmap.getPixels(pixels, 0, stride, 0, 0, width, height); // 读取图像数据,放入int数组中,int数组中的每个int数据包含rgb三个分量
for (int i = 0; i < pixels.length; ++i) {
	int pixel = pixels[i];
//  data[i * 3] = pixel >> 16 & 0xff;
	data [i * 3] = (byte)Color.red(pixel);
	data [i * 3 + 1] = (byte)(pixel >> 8 & 0xff);
	data [i * 3 + 2] = (byte)(pixel & 0xff);
}
// 读取png图像以rgba格式存储为byte数组
FileInputStream img = new FileInputStream("img.png");
Bitmap bitmap = BitmapFactory.decodeStream(img);
int pixel = bitmap.getPixel(0, 0);
int a = Color.alpha(pixel);
int r = Color.red(pixel);
int g = Color.green(pixel);
int b = Color.blue(pixel);

int bytes = bitmap.getByteCount(); // 获取bitmap数据大小,存储的是argb数据
ByteBuffer buffer = ByteBuffer.allocate(bytes);
bitmap.copyPixelsToBuffer(buffer); // 复制数据
buffer.position(0);
byte[] bb = new byte[buffer.remaining()];
buffer.get(bb);  // bb中存储的是rgbargba...数据
// 一些Bitmap相关操作
int bytes = bitmap.getByteCount(); // Bitmap像素点的色彩通道排列顺序是RGBA
ByteBuffer buffer = ByteBuffer.allocate(bytes); //  使用allocate()静态方法创建字节缓冲区
bitmap.copyPixelsToBuffer(buffer); // 将位图的像素复制到指定的缓冲区

int w = bmp.getWidth();
int h = bmp.getHeight();

//byte 与 int 的相互转换
public static byte intToByte(int x) {
	return (byte) x;
}

public static int byteToInt(byte b) {
	//Java 总是把 byte 当做有符处理;我们可以通过将其和 0xFF 进行二进制与得到它的无符值
	return b & 0xFF;
}
 

参考:
[1] RGB和Bitmap互相转换
[2] android利用BitMap获得图片的像素数据
[3] 【Android】二进制图片和Bitmap的getPixel方法解析
[4] Java 中 byte、byte 数组和 int、long 之间的转换

你可能感兴趣的:(c++,#,python,ios,ruby,git)