如何在开始时不会覆盖

时间:2015-11-16 18:56:22

标签: c++

我想在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];

但是我想制作一个不使用数组的。有没有办法制作一些不会覆盖的东西,只是在字母之前写字?

3 个答案:

答案 0 :(得分:0)

  1. 从输入文件中读取字符并将其复制到矢量。
  2. 将矢量中的字符以相反的顺序保存到输出文件中。
  3. 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)

这更多的是蓝图,实现需要直接处理文件缓冲区,而文件缓冲区更像是一个例行程序,但只要花一些时间进行实现和调试就可以完成。当然,在这种情况下,行尾字符需要特殊处理。