我一直试图在不使用指针的情况下解决这个问题,只考虑基础知识(我是学生),但我不能解决问题。
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]);
我将不胜感激任何帮助。
答案 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 ++时,一切都变得微不足道了:
std::ifstream
和std::ofstream
可用于文件输入/输出。
std::vector
可用作通用的可调整大小数组。
std::ostringstream
可用于将整个原始文件加载到内存中。
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);
}