使用数组以 ASCII 顺序排列 txt 文件中的行并显示它们

arrange line in txt file in ASCII order using array and display them

#include <stdio.h>
#include <string.h>
#include <fstream>
#include <iostream>

using namespace std;

int main() {
    ifstream infile;          // ifstream is reading file
    infile.open("read.txt");  // read.txt is the file we need to read
    std::cout << infile;
    string str;
    if (infile.is_open()) {
        while (getline(infile, str)) {
            char str[2000], ch;
            int i, j, len;
            len = strlen(str);
            for (i = 0; i < len; i++) {
                for (j = 0; j < (len - 1); j++) {
                    if (str[j] > str[j + 1]) {
                        ch = str[j];
                        str[j] = str[j + 1];
                        str[j + 1] = ch;
                    }
                }
            }
        }
        cout << "\nProcessed data:" << str;
    }

    return 0;
}

我的 txt 文件:

Today is a fine day.
It’s sunny.
Let us go out now!

我的结果应该是:

    .Taaaddefiinosyy
 ’.Innsstuy
    !Legnooosttuuw

此处也考虑了空格。 我是 C++ 的新手。 我需要专业人士的帮助。 非常感谢!

利用STL:

  • 使用 std::getline.
  • 将您的文件逐行读入 std::string
  • 使用 std::ranges::sort.
  • 对每一行进行排序
  • 打印出来。

下面的例子:

  • 还使用 fmt 库代替 std::cout,并且
  • std::istringstream 而不是 std::ifstream 读取。

[Demo]

#include <algorithm>  // sort
#include <fmt/core.h>
#include <sstream>  // istringstream
#include <string>  // getline

int main() {
    std::istringstream iss{
        "Today is a fine day.\n"
        "It's sunny.\n"
        "Let us go out now!\n"
    };

    fmt::print("Original file:\n{}\n", iss.str());

    fmt::print("Processed file:\n");
    std::string line{};
    while (std::getline(iss, line)) {
        std::ranges::sort(line);
        fmt::print("{}\n", line);
    }
}


// Outputs:
//
//   Original file:
//   Today is a fine day.
//   It's sunny.
//   Let us go out now!
//   
//   Processed file:
//       .Taaaddefiinosyy
//    '.Innsstuy
//       !Legnooosttuuw

您的代码无效,因为:

  1. std::cout << infile;是错误的。如果要打印 istream::operator bool() 的结果以确定文件是否成功打开,则应改为 std::cout << infile.operator bool();std::cout << static_cast<bool>(infile);。但是,简单地写 std::cout << infile.fail();std::cout << !infile.fail();.
  2. 可能会更好
  3. 函数std::strlen需要一个指向有效字符串的指针作为参数。也许你打算写 str.length()?在这种情况下,您应该删除声明 char str[2000],因为它隐藏了声明 string str;.
  4. 您应该在排序后立即打印排序结果,以免被下一行覆盖。目前你只在程序结束时打印内容 str 一次,所以你只打印最后一行。

执行上述修复后,您的代码应如下所示:

#include <stdio.h>
#include <string.h>
#include <fstream>
#include <iostream>

using namespace std;

int main() {
    ifstream infile;          // ifstream is reading file
    infile.open("read.txt");  // read.txt is the file we need to read
    std::cout << infile.fail();
    string str;
    if (infile.is_open()) {
        while (getline(infile, str)) {
            char ch;
            int i, j, len;
            len = str.length();
            for (i = 0; i < len; i++) {
                for (j = 0; j < (len - 1); j++) {
                    if (str[j] > str[j + 1]) {
                        ch = str[j];
                        str[j] = str[j + 1];
                        str[j + 1] = ch;
                    }
                }
            }

            cout << "\nProcessed data:" << str;
        }
    }

    return 0;
}

为输入

Today is a fine day.
It's sunny.
Let us go out now!

这个程序有以下输出:

0
Processed data:    .Taaaddefiinosyy
Processed data: '.Innsstuy
Processed data:    !Legnooosttuuw

请注意,您问题中的输入包含正向勾号 而不是撇号 '。这可能会引起麻烦。例如,当我测试你的程序时,这个前向刻度被编码成一个 multi-byte UTF-8 字符,因为它不能用 7 位 US-ASCII 表示。这导致您的排序算法失败,因为它只支持 single-byte 个字符。我只能通过在输入中用撇号替换正向勾号来修复这个错误。