-1

我目前正在尝试编写一个从文本文件中读取单词的程序。最后我计划从文件中读取某些单词等等,但目前我无法让我当前的代码工作。

我有 3 个文件。头文件、主文件和实现文件。

读字.h

#ifndef READWORDS_H
#define READWORDS_H
/**
* ReadWords class. Provides mechanisms to read a text file, and return
* capitalized words from that file.
*/
using namespace std;

#include <string>
#include <fstream>

 class ReadWords
 {
   public:
    /**
     * Constructor. Opens the file with the default name "text.txt".
     * Program exits with an error message if the file does not exist.
     */
     ReadWords();

    /**
     * Constructor. Opens the file with the given filename.
     * Program exits with an error message if the file does not exist.
     * @param filename - a C string naming the file to read.
     */
     ReadWords(char *filename);

    /**
     * Closes the file.
     */
     void close();


   // working storage.
   private:
     string nextword;
     ifstream wordfile;
     bool eoffound;

 };

 #endif

ReadWords.cpp

#include "ReadWords.h"
#include <iostream>
using namespace std;

//:: Defines function as member of class.


ReadWords::ReadWords(char *filename)
{
    ifstream str;
    str.open("hamlet.txt");
    char c;
    while ((c = str.get()) !=EOF){
        cout << c << endl;
    }
}

void close()
{

}

主文件

#include "ReadWords.h"

int main()
{
    ReadWords rw;
    rw.ReadWords("hamlet.txt");
}

现在我知道我显然做错了什么,但我不是 100% 确定是什么。我在编译中收到的错误如下:

main.cpp: In function `int main()':
main.cpp:6: error: invalid use of `class ReadWords'

工具已完成,退出代码为 1

任何帮助是极大的赞赏。:)

4

6 回答 6

2

在您的 main.cpp 中,您错过了#include ReadWords.h指令中的引号。要解决此问题,您应该使用#include "ReadWords.h".

另外,您应该注意std::istream::get只返回一个字符。如果你想阅读 a (for example) 中的整个单词std::string,你应该std::istream::operator >>这样使用:

std::ifstream in("my_file");
std::string word;

if (in.is_open()) {
    while (in >> word) {
        //do something with word
    }
}

另一件突出的事情是,在rw.ReadWords("hamlet.txt")您调用构造函数时,就好像它是成员函数一样。使用该重载的正确方法是:ReadWords rw("hamlet.txt").

附带说明:构造函数的工作是初始化对象。在它的身体内做更多的事情并不是一个好习惯。

于 2012-11-11T17:34:15.043 回答
0

您的编程中有许多错误:

  1. 关闭您打开的文件。永远记住这一点,它可能会导致运行时错误。
  2. 在 main.cpp 文件的第一行是 #include "ReadWords.h"
  3. 在代码行末尾添加一个分号:rw.ReadWords("hamlet.txt");
于 2012-11-11T17:39:55.403 回答
0

要修复编译器的第一个错误,main.cpp 的第一行

#include ReadWords.h

需要是:

#include "ReadWords.h"
于 2012-11-11T17:32:55.657 回答
0

它应该是

#include "ReadWords.h"

或者

#include <ReadWords.h>
于 2012-11-11T17:33:03.873 回答
0

首先,您需要添加一个“;” 在 main.cpp 中的 rw.ReadWords("hamlet.txt") 之后。这就是编译器输出的最后一行的含义。

于 2012-11-11T17:33:16.570 回答
0

这似乎是不必要的复杂。这不行吗?

vector<string> words;
string word;
while(cin >> word)
    words.push_back(word);
于 2012-11-11T17:33:58.070 回答