1

所以我试图从一个文件中取出单词并将它们保存到一个动态数组中,然后打印按字母顺序排序的数组以及数组中每个单词的一致性。我在识别特殊字符/数字并将它们从数组中删除时遇到问题。我想使用 isalpha 函数,因为它在分配提示中。当我运行我的代码时,它运行良好,但特殊字符和数字不会从数组中消除。关于如何使用 isalpha 执行此操作的任何想法?

#include <iostream>
#include <stream>
#include <iomanip>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <string>

using namespace std;

void loadData();
void checkSpecialCharacters(string wordPtr, int size);
void alphabeticalSort(string *wordPtr, int size);
void frequencyCounter(string *wordptr, int size);


int main()
{
loadData();
return 0;
}

void loadData()
{
string fileName;
cout << "This program processes any text file to give you the concordance for each word present, and how many times it appears in the file." << endl;
cout << "Please enter the name of the text file you want to process followed by '.txt': " << endl;
cin >> fileName;

ifstream dataFile(fileName);
if (dataFile.fail())
{
    cerr << fileName << " could not be opened." << endl; //error message if file opening fails
    exit(-1);
}
string word;
int size = 0;
while (dataFile >> word)
{
    size++;
}
dataFile.clear();
dataFile.seekg(0);

string* wordPtr = new string[size];

int ctr = 0;
for (int i = 0; i < size; i++)
{
    dataFile >> wordPtr[i];
    checkSpecialCharacters(wordPtr[i], size);
    std::transform(wordPtr[i].begin(), wordPtr[i].end(), wordPtr[i].begin(), ::tolower);
    cout << wordPtr[i] << endl;
    
}
    dataFile.close();
    alphabeticalSort(wordPtr, size);
    frequencyCounter(wordPtr, size);
    delete[] wordPtr;
}

void checkSpecialCharacters(string wordPtr, int size)
{
for (int i = 0; i < size; i++)
{
    if (isalpha(wordPtr[i]) == true)
    {
        for (int j = 0; j < size; j++)
        {
            wordPtr[j] = wordPtr[j + 1];
            cout << wordPtr[j];
        }
    }
}
}



void alphabeticalSort(string *wordPtr, int size)
{
int i, j;
string temp; //temporary holding variable

for (i = 0; i < (size - 1); i++)
{
    for (j = 0; j < (size - 1); j++)
    {
        if ((wordPtr[j])>(wordPtr[j + 1]))
        {
            temp = wordPtr[j];
            wordPtr[j] = wordPtr[j + 1];
            wordPtr[j + 1] = temp;
        }
    }
}
}
void frequencyCounter(string *wordPtr, int size)
{
    string finalFileName;
    cout << "Please enter the name of the file that you want to store the concordance in followed by .txt: " << endl;
    cin >> finalFileName;
    ofstream concordanceFile(finalFileName, ios::out);
    if (concordanceFile.fail())
    {
        cerr << finalFileName << " could not be opened." << endl;
        exit(-1);
    }
    int frequency = 1;
    int index = 1;
    string element = wordPtr[0];
    while (index < size)
    {
        if (wordPtr[index - 1] == wordPtr[index]) // check if element is equal to previous element
        {
            frequency++;
            index++;
        }
        else
        {
            concordanceFile.setf(ios::left);
            concordanceFile << setw(10) << element << " " << setw(10) << frequency << endl;
            cout.setf(ios::left);
            cout << setw(10) << element << " " << setw(10) << frequency << endl;
            element = wordPtr[index];
            index++;
            frequency = 1; //reset frequency
        }
    }
    cout << "Concordance data saved in " << finalFileName << " successfully!" << endl;
}
4

0 回答 0