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

How do I reverse the a array of chars and store them in a new file?

我一直试图在不使用指针的情况下解决这个问题,只使用基础知识(我是一名学生)但我无法找到解决方案。

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),其中包含字符(中间有一个 space):

e e a a e e a a e e a a

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

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

如有任何帮助,我将不胜感激。

可以用std::reverse反转arrin-place。除非您始终确定 arr 的所有 100 值都包含有意义的值,否则您需要跟踪您读取了多少个值。

当您使用地道的 C++ 时,一切都变得微不足道:

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

    // Read from `ifs` into a `arr` vector.
    // (From "").
    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();
} 

好的,假设您已经将一些字符串读入数组 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-terminated 才能使 strlen 正常工作。所以在你读完数据后(比如 l 个字符)做 arr[l] = '[=18=]';

您正在使用此代码来反转:

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

想一想。在前 50 次迭代中,您 rewrite 数组的前半部分使用镜像的第二部分数据,在后 50 次迭代中,您 rewrite 第二部分使用你已经复制到第一个。您需要的是:

for (int i = 0; i < 50; i++) 
{
    char tmp; //you can use std::swap instead.
    tmp = arr[i];
    arr[i] = arr[100-i];
    arr[100-i] = tmp;
}

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

在 C++ 中,通过使用向量和流迭代器,您可以这样做(针对任意数量的字符进行泛化):

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, " "));

为什么不倒序保存呢?

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);
}