C ++从文本文件,逐字逐句或char字符中读取单词

时间:2010-09-15 04:20:45

标签: c++ file-io textinput

我一直在谷歌上搜索并阅读我的书并试图写出代码来阅读文本文件并逐个处理它,所以我可以按字母顺序排列并保持计数使用了多少单词,使用了多少单词。我似乎无法使我的GetNextWord()函数正常工作,这让我发疯。

我需要逐个读取单词,如果是大写,则将每个字母转换为小写。我知道如何做到这一点,并成功地做到了这一点。它只是按字符逐字逐句地将它放入一个阻碍我的字符串中。

这是我最近的一次尝试:任何帮助都会令人惊叹,或者链接到如何逐字逐句读取输入文件的教程。 (Word是字母字符a-z和'(不)以空格,逗号,句号,;,:等结束....

void GetNextWord()
{
    string word = "";
    char c;

    while(inFile.get(c))
    {
        while( c > 64 && c < 123 || c == 39)
        {
            if((isupper(c)))
            {
                c = (tolower(c));
            }
            word = word + c;
        }
        outFile << word;
    }
}

5 个答案:

答案 0 :(得分:8)

您可以使用>>运算符逐字读取文件。例如,请参阅此链接:http://www.daniweb.com/forums/thread30942.html

我在这里摘录了他们的例子:

ifstream in ( "somefile" );
vector<string> words;
string word

if ( !in )
  return;

while ( in>> word )
  words.push_back ( word );

答案 1 :(得分:3)

你的逻辑错了。只要c没有改变,内循环就会运行,并且其中没有任何内容会改变c

为什么你还有两个循环?我想你可能会对这个函数是否应该读下一个单词或所有单词感到困惑。尝试将这些问题分开,将它们放入不同的函数中(其中一个函数调用另一个函数)。我发现以自上而下的顺序解决这些问题最容易:

while(inFile.good()) {
  std::string word = GetNextWord(inFile);
  if(!word.empty())
    std::cout << word << std::endl;
}

现在通过定义GetNextWord()来填补空白,以读取下一个单词边界的所有内容。

答案 2 :(得分:0)

我个人喜欢使用std::getline(std::istream&, std::string&)读取输入(在<string>标题中,但您当然还需要#include一个流标题。)

此函数在换行符中断开,换行符是您的问题定义的空白。但这不是你问题的全部答案。在阅读文本行后,您将需要使用string operations或标准算法将字符串分解为单词。或者你可以手工循环遍历字符串。

胆量如下:

std::string buffer;
while (std::getline(std::cin, buffer) {
// break each line into words, according to problem spec
}

答案 3 :(得分:0)

我用

// str is a string that holds the line of data from ifs- the text file.
// str holds the words to be split, res the vector to store them in.
while( getline( ifs, str ) ) 
    split(str, res);


void split(const string& str, vector<string>& vec)
{
    typedef unsigned int uint;

    const string::size_type size(str.size());
    uint start(0);
    uint range(0);

 /* Explanation: 
  * Range - Length of the word to be extracted without spaces.
  * start - Start of next word. During initialization, starts at space 0.
  * 
  * Runs until it encounters a ' ', then splits the string with a substr() function,
  * as well as making sure that all characters are lower-case (without wasting time
  * to check if they already are, as I feel a char-by-char check for upper-case takes
  * just as much time as lowering them all anyway.                                       
 */
    for( uint i(0); i < size; ++i )
    {
        if( isspace(str[i]) )
        {
            vec.push_back( toLower(str.substr(start, range + 1)) );
            start = i + 1;
            range = 0;
        } else
            ++range;
    }
    vec.push_back( toLower(str.substr(start, range)) );
}

我不确定这对你有什么帮助,但我会试试。 toLower函数是一个简单使用:: toLower()函数的快速函数。这会将每个char读取到一个空格,然后将其填入向量中。我不完全确定你对char的意思是什么。

你想一次提取一个单词字符吗?或者你想在你去的时候检查每个角色?或者你的意思是你想提取一个单词,完成,然后再回来?如果是这样,我会1)推荐一个矢量,2)让我知道所以我可以重构代码。

答案 4 :(得分:0)

如果c =='a',会终止你的内循环? 'a'的ASCII值为97。