2010-09-15 59 views
4

从一个文本文件,一个字一个字或字符的话我一直在使用Google周围,并通过我的书,读书,并努力写出的代码通过一个文本文件和进程的话出来的阅读,一个一个,所以我可以把它们按字母顺序排列,并且记下使用了多少单词和多少单词。我似乎无法让我的GetNextWord()函数正常工作,这让我发疯。C++读由焦炭

我需要一个读取,一个字,每一个字母转换为小写字母如果是大写。我知道如何做到这一点,并已成功完成。它只是逐字逐字地放入字符串,并把它放到一个支持我的字符串中。

这是我最近尝试吧:任何帮助将是惊人的或过如何通过字从输入文件中读取单词的教程的链接。 (字是字母字符AZ和“(不)用空格,逗号,句号,结束了;,:,ECT ....

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; 
    } 
} 
+0

输出问题? – 2010-09-15 04:27:39

+0

另外,将括号放在你的while条件中以明确定义它们。 – 2010-09-15 04:30:44

+5

不使用魔术数字,他们不便携。使用'A'或'Z'或其他任何39应该是。 – 2010-09-15 04:31:48

回答

3

您的逻辑错误。内循环运行只要c不会改变,并且没有任何内容会改变c

为什么你有两个循环呢?我想你可能会对这个功能是否应该读取下一个单词或所有单词感到困惑。尝试分离这些问题,将它们放入不同的功能(其中一个叫另一个)。我觉得最简单的一个自上而下的顺序来处理这一问题:

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

通过定义GetNextWord()阅读一切都交给下一个字边界现在填补空白。

+0

我会试试这个,并且报告我的结果,谢谢 – MSwezey 2010-09-15 20:24:06

+0

谢谢!奇迹般有效! – MSwezey 2010-09-15 21:00:39

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

但是,该运算符使用与要求的内容不同的定义。 – sbi 2010-09-15 05:13:25

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 
} 
+0

如果文本中有连字词,这可能会有问题。 – 2010-09-15 08:38:20

+0

像“back-scatter”这样的带连字符的单词并不重要,因为问题规范定义了是否将其计为一个或两个单词。但是,如果我正确理解Space_C0wb0y,那么在下一行连续显示的单词将需要比我所显示的逻辑更多的逻辑。由于这个程序听起来很像家庭作业,我怀疑这将是有效的输入,但如果是这样,那么就需要处理这样的输入。 – 2010-09-15 20:45:16

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 by char。

你想提取由时间单词字符?还是你想检查每个人物?或者你的意思是你想提取一个词,完成,然后回来?如果是这样,我会1)推荐一个载体,2)让我知道,所以我可以重构代码。

+0

我原来的计划是一次一个字地读char,一次char字符,当它遇到空格或任何标点符号时,它将停止获取该单词,将所有这些字符转换为一个字符串并将该字符串发送给我的其他函数以供进一步处理处理。将所有大写字母转换为小写字母。 IE“不要”会变成“不”。 – MSwezey 2010-09-15 20:17:05

0

这是怎么回事终止您的内环如果c ==“A”? “a”的ASCII值为97.

+0

如果c == a那么它不会终止内部循环。内部循环终止,如果字符不是A-Z,a-z,并且' – MSwezey 2010-09-15 21:01:48