使用数组以 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
读取。
#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
您的代码无效,因为:
- 行
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();
. 可能会更好
- 函数
std::strlen
需要一个指向有效字符串的指针作为参数。也许你打算写 str.length()
?在这种情况下,您应该删除声明 char str[2000]
,因为它隐藏了声明 string str;
.
- 您应该在排序后立即打印排序结果,以免被下一行覆盖。目前你只在程序结束时打印内容
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 个字符。我只能通过在输入中用撇号替换正向勾号来修复这个错误。
#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::ranges::sort
. 对每一行进行排序
- 打印出来。
std::string
下面的例子:
- 还使用
fmt
库代替std::cout
,并且 - 从
std::istringstream
而不是std::ifstream
读取。
#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
您的代码无效,因为:
- 行
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();
. 可能会更好
- 函数
std::strlen
需要一个指向有效字符串的指针作为参数。也许你打算写str.length()
?在这种情况下,您应该删除声明char str[2000]
,因为它隐藏了声明string str;
. - 您应该在排序后立即打印排序结果,以免被下一行覆盖。目前你只在程序结束时打印内容
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 个字符。我只能通过在输入中用撇号替换正向勾号来修复这个错误。