c++ - 我需要编写一个具有这些目标的 c++ 程序
问题描述
从文本文件中读取数据的 C++ 程序。假设文本文件包含关于任何主题的段落。您的程序要求用户输入不带扩展名的文件名。现在,用户定义的函数(名称:ReadWordByWord())逐字读取所有数据并存储在字符类型数组中,并根据数据动态增长。最后,声明一个用户定义的函数(名称:SaveInReverse()),它将此文本以单词的相反顺序存储到文本文件中(名称由用户输入),例如最后一个单词将存储在开头,然后是第二个最后一个单词,第三个原始文件的最后一句话等。这就是我到目前为止所做的......这里我没有使用删除命令,如果我使用会导致错误 - 堆错误。我怎样才能首先做到这一点?然后有什么建议可以改进这个程序。
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
char* readWordByWord(char * old)
{
int coun = 0;
for (int i = 0; old[i] != '\0'; i++) // to find the length of word
{
coun++;
}
char *newArr = new char[coun + 1];
strcpy(newArr, old);
//delete[]old; // this is where i am putting delete command to delete the previous i.e old array and then return the new one
return newArr;
}
int size = 100;
int main()
{
fstream fin;
string forCopy[1000];
int index = 0;
fin.open("file.txt");
char *p = new char[size];
while (fin >> p)
{
p = readWordByWord(p);
//cout << p<<endl;
forCopy[index++] = p;
/*for (int i = 0; p[i] != '\0'; i++)
{
}*/
}
for (int i = index - 1; i > 0; i--)
cout << forCopy[i] << " ";
delete[]p;
p = NULL;
fin.close();
return 0;
}
解决方案
我已经从头开始了(不能包含换行符,因为只需要一个段落):
#include <iostream>
#include <fstream>
#include <string>
void reverse(char *begin, char *end) { // reverses a word
char temp;
while (begin < end) {
temp = *begin;
*begin++ = *end;
*end-- = temp;
}
}
void reverseParagraph(char *arg) { // reverses each word of the paragraph
char *word_begin = arg;
char *temp = arg;
while (*temp) {
temp++;
if (*temp == '\0')
reverse(word_begin, temp - 1);
else if (*temp == ' ') {
reverse(word_begin, temp - 1);
word_begin = temp + 1;
}
}
reverse(arg, temp - 1);
}
int main() {
std::ifstream file("file.txt");
std::string fileData = "";
while(getline(file, fileData)); // counting the number of letters for memory allocation
size_t len = fileData.length();
char *str = new char[len + 1];
strcpy(str, fileData.c_str());
reverseParagraph(str); // reverse the entire character pointer
std::cout << str << std::endl; // displays for testing
std::ofstream fileOut("out.txt");
fileOut << str << std::endl; // saving the output into another file
fileOut.close();
delete[] str;
file.close();
return 0;
}
该程序首先获取文件的包含数据,然后分配给一个变量。然后在获取字符串长度后将变量转换为字符(指针)。
之后,它递归地反转每个单词的位置fileData
,最后显示出来。修改后的数据随后被打印到另一个文件中。
推荐阅读
- api - 带有区域的 api 的 Dotnet Core 3.1 端点路由
- javascript - 棘手的表单提交
- java - 立方体 3D 点旋转 X 和 Z
- elasticsearch - ElasticSearch 父/子查询需要将近 10 秒才能运行
- node.js - CubeJS如何在join中传递动态列名?
- java - 我正在尝试解决这个 leetcode 问题
- javascript - TypeError:无法读取 Vue.js 中 eval (dashboard.v1.vue?88bf:1465) 处未定义的属性 'gaugeData2'
- c++ - 如何从地图中删除矢量对象
- ios - 如何:格式化 Swift UI 按钮
- javascript - 错误:无法链接顶点和片段着色器