0

我正在尝试从文本文件中逐个字符地读取直到 EOF,将它们放入字符数组中,以便之后可以对其进行操作。用 g++ 编译没有错误,运行时,我被提示输入输入文件,但它只是挂起。

int main (int argc, char *argv[]) {
    string filename;
    ifstream infile;

    char *cp, c[1024];
    memset (c, 0, sizeof(c));
    cp = c;

    cout << "Enter file name: " << endl;
    cin >> filename;

    //open file
    infile.open( filename.c_str() );

    //if file can't open
    if(!infile) {
        cerr << "Error: file could not be opened" << endl;
        exit(1);
    }

    while (!infile.eof()); {
        infile.get(c, sizeof(infile));
       // get character from file and store in array c[]
    }
}//end main
4

3 回答 3

1

您应该尝试该istream::read()方法而不是get(). 这将有助于解决任何缓冲区溢出问题:

unsigned int chars_read = 0;
//...
// Read in the file.
if (!infile.read(c, sizeof(c))
{
    // Handle the read error here.
    // Also check for EOF here too.
}

// Obtain the number of characters actually read.
chars_read = infile.gcount();
于 2012-11-25T04:05:04.373 回答
0

首先,你不想测试eof()!不知怎的,我开​​始觉得堂吉诃德找到了我的风车。但是,我知道您需要在尝试读取输入后检查输入是否成功因为在尝试读取流之前无法知道它是否会成功。

你的程序实际上并没有挂起!它只是等待您输入sizeof(infile)字符或结束输入(例如,在 UNIX 上使用 Ctrl-D,在 Windows 上使用 Ctrl-Z)。当然,这可能看起来像一个悬挂程序。您可以通过使用较小的尺寸来验证这确实是问题所在,例如4. 当然,sizeof(infile)它几乎和一个小的随机数一样好:它是一个类型对象的大小,std::ifstream谁能告诉它是什么?您可能打算使用sizeof(c)来确保调用get(c, n)不会写出比c.

于 2012-11-25T03:26:22.370 回答
0

试试这个:

int cont = 0;
while(infile.good()) {
  c[cont++] = infile.get();
}
于 2012-11-25T03:33:09.173 回答