我想在C ++中创建一个程序,它将读取一个文本文件的内容,并以相反的顺序将其写入另一个文件中。例如,如果在文件一中,则会出现:
Hi This
Is File
我希望文件2成为:
eliF sI
sihT iH
我想这样做:
char c;
while(ifs.get(c))
{
ofs.seekg(0);
ofs.put(c);
}
但每次覆盖字符时输出都是最后一个。
我设法制作了一个如下所示的程序:
int i=0;
char chars[100];
while(ifs.get(chars[i])) i++;
cout<<endl<<endl;
for (; i>=0; i--)
cout<<chars[i]<<" ";
for(; i>=0; i--)
ofs << chars[i];
但是我想制作一个不使用数组的。有没有办法制作一些不会覆盖的东西,只是在字母之前写字?
答案 0 :(得分:0)
std::vector<char> chars;
char c;
while ( ifs.get(c) )
{
chars.push_back(c);
}
size_t size = chars.size();
for ( size_t i = size; i > 0; i-- )
{
ofs.put(chars[i-1]);
}
答案 1 :(得分:0)
你可以按照以下方式进行:
#include<sstream>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s,s1="";
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
while(getline(cin,s))
{
s1+=s;
s1+='\n';
}
for(int i=s1.length()-1; i>=0; i--)
cout<<s1[i];
return 0;
}
这里首先从输入文件中读取所有整行。(请将其命名为input.txt
。并在代码所在的同一目录中创建名为output.txt
的文件。然后每行添加一个空字符串s1
,并在每行后添加newline
。最后打印reversed
订单。这是解决方案。试试吧。
答案 2 :(得分:0)
解决问题的最佳方法是以二进制模式打开源文件(文本模式意味着从顶部读取),例如,使用FILE* pInFile = fopen(filePathIn, "rb");
FILE* pOutFile = fopen(filePathOut, "w+b");
reverseFileRead(pFileIn,
[=](char* p, size_t bufferSize){reverseBufferWrite(pOutFile, p, bufferSize);});
,然后通过缓冲区从底部向后读取缓冲区。然后,每个缓冲区字符将从结尾开始写入输入缓冲区的输出。
void reverseFileRead(FILE* pInFile, std::function<void(char*, size_t)>&);
void reverseBufferWrite(FILE* pOutFile, char* buffer, size_t bufferSize);
其中
row_cut = 0
col_cut = 3
m,n = mat.shape
row_mask = ~np.in1d(np.arange(m),row_cut)
col_mask = ~np.in1d(np.arange(n),col_cut)
out = mat[(row_mask[:,None]*col_mask)].reshape(-1,n-1)
这更多的是蓝图,实现需要直接处理文件缓冲区,而文件缓冲区更像是一个例行程序,但只要花一些时间进行实现和调试就可以完成。当然,在这种情况下,行尾字符需要特殊处理。