用C ++读取行直到EOF

时间:2015-02-25 02:23:10

标签: c++ cin eof

我正在编写一个从cin逐行读取的函数,并在看到;个字符时返回。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>

using namespace std;

int read_cmd(char *cmd)
{
    cout << "Please enter a string: \n";
    cmd[0]='\0';

    while(1){
        char currentLine[10000];
        currentLine[0]='\0';
        cin.getline(currentLine,10000);
        if (strcmp(currentLine,";")==0){
            break;
        }
        strcat(cmd, "\n");
        strcat(cmd, currentLine);
    }
    return 0;
}

int main(){
    char cmd[1000];
    while (1){
        read_cmd(cmd);
        cout<< cmd << endl;
    }
}

然后,我使用通过管道从另一个文件提供的文本对其进行测试。 ./read_cmd&lt; test_file里面

test_file的内容:

line 1
line 2
;

这输出结果很好,但它最后给了我一个分段错误。 cin是否有办法检查它是否会遇到EOF并终止?

2 个答案:

答案 0 :(得分:0)

我强烈建议使用string对象来做这样的事情,这样你就不会浪费空间,也不会确保你有足够的空间。你也可以不用循环来做。

string currentLine;
getline(cin, currentLine, ';');

现在,如果你需要得到包含分号的最后一行,则需要一个循环,但你仍然可以轻松地完成它。

string currentLine;
while(getline(cin, currentLine)){
    if(currentLine.find(";") != string::npos){
        break;
    }
}

使用字符串传递内容。总是有.clear()方法,任何字符串都可以轻松清空。

string getline
string Object

答案 1 :(得分:0)

要检测EOF,您应该使用以下内容:

while (cin.good() && !cin.eof())
{
    // Read the file
}

请参阅documentation for cin,特别是good()(用于错误检查)和eof()成员函数。

特别是this example可能会有所帮助。