如何反转字符数组并将其存储在新文件中?

时间:2017-01-31 14:13:23

标签: c++ arrays char reverse

我一直试图在不使用指针的情况下解决这个问题,只考虑基础知识(我是学生),但我不能解决问题。

void ReverseFile() {

FILE *originalM, *fin;

fopen_s(&originalM, "original.txt", "r");
fopen_s(&fin, "inverted.txt", "w");

char arr[100];

for (int i = 0; i < 100 && !feof(originalM); i++)
{
    fscanf_s(originalM, "%c ", &arr[i]);
    cout << arr[i] ;
}
cout << endl;
fclose(originalM);

for (int i = 0, k = 100; i < 100; i++, k--) 
{
    arr[k] = arr[i];
    cout << arr[k];
}
fclose(fin);}

到目前为止,我有这个函数和一个文本文件(originalM.txt),其中包含字符(中间有空格):

  

e e a a e e a a

在第一个循环中,我获取文件的每个字符并将其保存在数组中。问题出现在第二个循环中,我想要反转它们。我怎么解决这个问题?我试图创建一个新阵列并存储字符,但这不起作用。我还试图将它打印到新文件中:

fprintf(fin, "%c ", &arr[k]);

我将不胜感激任何帮助。

5 个答案:

答案 0 :(得分:4)

在C ++中,通过使用vector和stream迭代器,你可以这样做(对任意数量的字符进行推广):

void reverseFile(const string& in, const string& out)
{
    ifstream input(in);
    ofstream output(out);
    istream_iterator<char> inStart(input), inEnd;
    // load from the input file
    vector<char> data(inStart, inEnd);
    // copy back to the output file in reversed order
    copy(data.rbegin(), data.rend(), ostream_iterator<char>(output));
}

如果您想保留字符之间的空格,ostream_iterator也支持delimiter参数,那么为了保留空格,您只需将其添加到该行:

copy(data.rbegin(), data.rend(), ostream_iterator<char>(output, " "));

答案 1 :(得分:2)

您可以使用std::reverse就地撤销arr。除非您始终确保100的所有arr值都包含有意义的值,否则您需要跟踪您读取的值的数量。

使用惯用的C ++时,一切都变得微不足道了:

void ReverseFile() 
{
    std::ifstream ifs{"original.txt"};

    // Read from `ifs` into a `arr` vector.
    // (From "http://stackoverflow.com/questions/7241871").
    std::ostringstream oss;
    ss << file.rdbuf();
    const auto& s = ss.str();
    std::vector<char> arr(s.begin(), s.end());

    // Reverse `arr` in place:
    std::reverse(std::begin(arr), std::end(arr));

    // Save `arr` to file.
    std::ofstream ofs{"inverted.txt"};
    for(auto x : arr) ofs << x;
    ofs.flush(); 
    ofs.close();
} 

答案 2 :(得分:0)

好的,假设您已将某些字符串读入数组char arr[100];。现在要反转它你可以使用这样的东西:

size_t length = strlen(arr);
for (int i = 0; i < length / 2; ++i)
{
    char swapChar = arr[i];
    arr[i] = arr[length-i-1];
    arr[length-i-1] = swapChar;
}

您可以使用std::swap

代替for循环内的3个语句

std::swap(arr[i], arr[length-i-1]);

另一种方法是使用std::reverse已经由@VittorioRomeo回答。

编辑1:感谢@StoryTeller指出您的数组应该以NULL结尾,以便strlen能够正常工作。因此,在您阅读数据(比如l个字符)后,请执行arr[l] = '\0';

答案 3 :(得分:0)

您正在使用此代码进行反转:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="dashboard-hello" class="section-title"></div>

想一想。在前50次迭代中,您重写数组的前半部分,使用第二部分的数据进行镜像,在第二次50次迭代中,您重写第二部分,并将其复制到第一。你需要的是:

willFocus(name) {
  if(name==='nameButton') {
  oDocument.getElementById('nameInput').focus();
}

当然,像std :: reverse这样的解决方案更好。

答案 4 :(得分:0)

为什么不以相反的顺序保存?

void ReverseFile() {
    FILE *originalM, *fin;
    fopen_s(&originalM, "original.txt", "r");
    fopen_s(&fin, "inverted.txt", "w");

    char arr[100];
    for (int i = 0; i < 100 && !feof(originalM); i++)
    {
        fscanf_s(originalM, "%c ", &arr[i]);
        cout << arr[i] ;
    }
    cout << endl;
    fclose(originalM);

    for (int k = i - 1, k >= 0; k--) 
    {
        cout << arr[k];
    }
    fclose(fin);
}