本帖最后由 LordHdy 于 2018-11-14 21:26 编辑 #include <iostream>
#include <fstream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void MatrixTranspos(char* infilename, char* outfilename, unsigned long M, unsigned long N, int line)
{// 原矩阵文件名, 转置矩阵文件名, 行数, 列数, 一次读取行数
ifstream in;
ofstream out;
int buffsize = N*line*3+line*2; // 缓冲区大小 列数*要读取的行数*3(一个数字占三个字符的位置)+要读取的行数(换行符)
char *Matrix = new char[buffsize]; // 分配缓冲区内存
in.open(infilename, ios::in|ios::binary); // 打开原矩阵文件
out.open(outfilename, ios::out|ios::app); // 打开转置矩阵文件
if(!in || !out)
{
cout << "File open error!" << endl;
return ;
}
in.read((char*)Matrix, buffsize); // 按块读取数据
in.seekg(0, in.beg);
// cout.write((char*)Matrix, buffsize); // 输出缓冲区内数据
int k = 0;
for(int i = 0; i < N; i++) // 转置
{
for(int j = 0; j < line; j++)
{
out.write((char*)Matrix+3*N*j+2*j, 3);
cout.write((char*)Matrix+3*N*j+2*j, 3);
}
out << " " << ++k << '\n';
cout << endl;
Matrix = Matrix+3;
}
delete[] Matrix;
in.close();
out.close();
}
int main()
{
char *infile = "matrix.txt";
char *outfile = "transpos.txt";
// // 创建大矩阵文件
// ofstream out;
// out.open("matrix.txt", ios::out);
//
// srand((int)time(0));
// for(int i = 0; i < 3000; i++)
// {
// for(int j = 0; j <2000; j++)
// {
// out << setw(3) << (rand()%100); // 一个数字占三个字节的位置
// }
// out << endl;
// }
// out.close();
MatrixTranspos(infile, outfile, 3000, 2000, 10);
return 0;
}
以上是我写的矩阵转置的部分代码,只是用来测试,但是有问题,控制台输出的部分矩阵转置是正确的,但是输出到文件中的矩阵少了几行,有没有哪位可以帮忙看一下怎么回事,该怎么修改呀?
主函数中注释部分是生成原矩阵的代码。 |