首页 > 解决方案 > 我需要编写一个具有这些目标的 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;
}

标签: c++

解决方案


我已经从头开始了(不能包含换行符,因为只需要一个段落):

#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,最后显示出来。修改后的数据随后被打印到另一个文件中。


推荐阅读