将一个文件中的内容倒过来写到另一个文件中?

时间:2022-08-18 19:55:30
将一个 1M -10M 的文件,倒过来存储到另一个文件,就是前一个文件的最后一个
字符存到新文件的第一个字符,以此类推。

10 个解决方案

#1


#2


用文件映射放到内存的一段buffer,然后指针就在buffer中从后往前读写新文件.

#3


void writeBack()
{
 QFile file_1("\home\xxx.xxx");
 QFile file_2("\home\xxxBack.xxx");
 file_1.open(Read_Only);
 file_2.open(Raw|Write_Only);
 
 uint fileSize=file_1.size();
 QString tmp;

 for(uint i=fileSize; i==0; i--)
 {
   tmp=file_1.readBlock(i, 1);
   file_2.writeBlack(fileSize-i, tmp);
 }
 }
}

#4


#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<io.h>
#include<stdio.h>
#include<iostream>

using namespace std;


int main()
{
FILE * stream;
char * lp;
char * temp;//交换区;
unsigned long Len=0;//文件大小;
int fd,err;
fd=_open("f:\\1.txt",_O_RDONLY);//f盘下的文件,你可该路径;
if(fd ==-1)
{
cout<<"不能打开你的文件!"<<endl;
}
else
{
Len=_filelength(fd);
lp = new char[Len];
temp = new char[Len];
_close(fd);//释放文件描述符;
stream=fopen("f:\\1.txt","r+");
fread(lp,sizeof(char),Len,stream);
fclose(stream);
if( (fd = _open("f:\\1.txt", _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE )) != -1)
{
for(int i=Len-1;i>=0;i--)
{
temp[Len-1-i]=lp[i];
}
if(err=_write(fd,temp,Len)==-1)
{
cout<<"写入错误!"<<endl;
return 0;
}
else
{
cout<<"写入成功!"<<endl;
_close(fd);//释放文件描述符;
}
}
delete [] temp;
delete [] lp;
}
return 0;
}
不也可不设置文件交换区,把指针从最后字节开始一个字符一个字符考入文件也可。

#5


用STL来做最简单,用一个string来存储文件内容,再reverse,再写入新文件.

#6


#include <iostream>
#include <algorithm>

using namespace std;

int main() {
  ifstream input("test.txt");
  stringstream temp;
  temp << input.rdbuf();
  reverse(temp.str().begin(), temp.str().end());
  ofstream output("result.txt");
  output << temp.rdbuf();
}

#7


看Windows核心编程的内存映射文件拿一章.你会发现其他的办法都不是啥好办法.

#8


using namespace std;
vector<unsigned char> dataarray;
然后每从文件中读取一个字节数据a就写入dataarray:dataarray.push_back(a);

读取结束后,循环调用用dataarray.pop_back()获取数据逐个写入文件即可。

#9


看了楼上的很多方法,如果文件很大的话好像都没有好好考虑啊。
想到以前用汇编做的作业,每次COPY 1024个Byte,直到整个文件拷贝结束。
所以希望LZ能够考虑一下这个问题。

#10


mark

#1


#2


用文件映射放到内存的一段buffer,然后指针就在buffer中从后往前读写新文件.

#3


void writeBack()
{
 QFile file_1("\home\xxx.xxx");
 QFile file_2("\home\xxxBack.xxx");
 file_1.open(Read_Only);
 file_2.open(Raw|Write_Only);
 
 uint fileSize=file_1.size();
 QString tmp;

 for(uint i=fileSize; i==0; i--)
 {
   tmp=file_1.readBlock(i, 1);
   file_2.writeBlack(fileSize-i, tmp);
 }
 }
}

#4


#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<io.h>
#include<stdio.h>
#include<iostream>

using namespace std;


int main()
{
FILE * stream;
char * lp;
char * temp;//交换区;
unsigned long Len=0;//文件大小;
int fd,err;
fd=_open("f:\\1.txt",_O_RDONLY);//f盘下的文件,你可该路径;
if(fd ==-1)
{
cout<<"不能打开你的文件!"<<endl;
}
else
{
Len=_filelength(fd);
lp = new char[Len];
temp = new char[Len];
_close(fd);//释放文件描述符;
stream=fopen("f:\\1.txt","r+");
fread(lp,sizeof(char),Len,stream);
fclose(stream);
if( (fd = _open("f:\\1.txt", _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE )) != -1)
{
for(int i=Len-1;i>=0;i--)
{
temp[Len-1-i]=lp[i];
}
if(err=_write(fd,temp,Len)==-1)
{
cout<<"写入错误!"<<endl;
return 0;
}
else
{
cout<<"写入成功!"<<endl;
_close(fd);//释放文件描述符;
}
}
delete [] temp;
delete [] lp;
}
return 0;
}
不也可不设置文件交换区,把指针从最后字节开始一个字符一个字符考入文件也可。

#5


用STL来做最简单,用一个string来存储文件内容,再reverse,再写入新文件.

#6


#include <iostream>
#include <algorithm>

using namespace std;

int main() {
  ifstream input("test.txt");
  stringstream temp;
  temp << input.rdbuf();
  reverse(temp.str().begin(), temp.str().end());
  ofstream output("result.txt");
  output << temp.rdbuf();
}

#7


看Windows核心编程的内存映射文件拿一章.你会发现其他的办法都不是啥好办法.

#8


using namespace std;
vector<unsigned char> dataarray;
然后每从文件中读取一个字节数据a就写入dataarray:dataarray.push_back(a);

读取结束后,循环调用用dataarray.pop_back()获取数据逐个写入文件即可。

#9


看了楼上的很多方法,如果文件很大的话好像都没有好好考虑啊。
想到以前用汇编做的作业,每次COPY 1024个Byte,直到整个文件拷贝结束。
所以希望LZ能够考虑一下这个问题。

#10


mark

相关文章