如何反转字符数组并将它们存储在新文件中?
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
反转arr
in-place。除非您始终确定 arr
的所有 100
值都包含有意义的值,否则您需要跟踪您读取了多少个值。
当您使用地道的 C++ 时,一切都变得微不足道:
std::ifstream
and std::ofstream
可用于文件 input/output.
std::vector
可以用作通用的可调整大小的数组。
std::ostringstream
可用于将整个原始文件加载到内存中。
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);
}
我一直试图在不使用指针的情况下解决这个问题,只使用基础知识(我是一名学生)但我无法找到解决方案。
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
反转arr
in-place。除非您始终确定 arr
的所有 100
值都包含有意义的值,否则您需要跟踪您读取了多少个值。
当您使用地道的 C++ 时,一切都变得微不足道:
std::ifstream
andstd::ofstream
可用于文件 input/output.std::vector
可以用作通用的可调整大小的数组。std::ostringstream
可用于将整个原始文件加载到内存中。
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);
}