c++ - getline 并立即测试 EOF

标签 c++ fstream eof getline

我想问一下我的问题,我尝试阅读 Getline 和 EOF Question 但没有帮助。

问题是我不知道这里哪里可能出错: 使用的函数(getline 或检查 EOF)有问题吗?

如果 text.txt 文件中没有文本,则说明已找到某些内容。但我不知道为什么或在哪里犯了错误......

我想要的是:搜索字符串,如果 txt 文件中没有文本,我希望它显示 EOF 或其他内容。它仍然说 - 即使文件是空的 - 我正在寻找的字符串在第一行,第一个位置找到 - 例如

我把代码放在那里:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int openFile(void);
int closeFile(void);
int getTime(void);
int findTime();
int findDate();
int stringFind(string);
bool getOneLine(void);

string what;
bool ifound = false;
string foundstring;
string filename ;
fstream inputfile;
string sentence ;
size_t found ;
string foundTime ;
string foundDate ;
bool timeIsHere = false;
bool dateIsHere = false;

int iterTime = 0;
int iterDate = 0;
int line = 0;


int main (void){
    sentence.clear();

    cout << " Enter the file name:" << endl;

    openFile();


    while (getOneLine() != false) {
        stringFind("Time");
    }




    cout << "END OF PROGRAM" << endl;
    system("PAUSE");
    ///getTime();
    closeFile();


    system("PAUSE");
}


int closeFile(void) {
    inputfile.close();
    cout << " File: " << filename <<  " - was closed...";
    return 0;
}

int openFile(void) {

    cout << " Insert file name in program directory or full path to desired file you want to edit:"<<endl;
    cout << " Do not use path with a space in directory address or filename ! " << endl;
    cout<<" ";
    getline(cin, filename);

    inputfile.open(filename, ios::in);

    cout <<" file_state: " << inputfile.fail();
    if (inputfile.fail() == 1) {
        cout << " - Cannot open your file" << endl;
    }
    else cout << " - File was openned sucesfully"<< endl;



    return 0;

}


int stringFind(string what) {
    cout << " I am looking for:" << what << endl;

    found = what.find(sentence);
    if (found == string::npos) {
        cout << " I could not find this string " << endl;

    }
    else if(found != string::npos){
        cout << " substring was found in line: " << line + 1 << " position: " << found + 1 << endl << endl;
        ifound = true;
        foundstring = sentence;

    }

    return 0;


}  



bool getOneLine(void) {
    if (inputfile.eof()) {
        cout << "END OF FILE" << endl << endl;
        return false;
    }
    else{
        getline(inputfile, sentence);
        cout << "next sentence is: "<< sentence  << endl;
        return true;
        }
}

我是新手,没有人可以问 - 就个人而言。我试图编辑 While 循环和 IF 以确保我没有犯严重错误,但我不知道。

我用 sample.txt 等试过了,这个文件是空的。

最佳答案

始终 测试输入是否在之后 读取尝试成功!流无法知道您正在尝试做什么。它只能报告到目前为止尝试是否成功。所以,你会做类似的事情

if (std::getline(stream, line)) {
    // deal with the successful case
}
else {
    // deal with the failure case
}

在失败的情况下,您可能想要使用 eof() 来确定失败是否是由于到达流的末尾造成的:到达文件末尾因此,std::ios_base:eofbit 被设置通常不是错误,而只是表明您已完成。它可能仍然是一个错误,例如,当知道要读取多少行但获得的行数更少时。

关于c++ - getline 并立即测试 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38410530/

相关文章:

c++ - 单个函数的两个可变参数模板?

c++ - 读取二进制文件时如何输出?

c - Scanf输入及其他问题

c++ - 不能使用 cin 两次,cin.clear 和 cin.ignore 也不起作用

c - 当 child 在获得 EOF 后退出时, parent 会获得 EOF?

c++ - 无法解析的外部符号 : @12 vs @8 at the end of symbol name

c++ - 如何将二维数组初始化为0

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 如何在保留提取格式化字符串(如 cout)的能力的同时存储字符串?

c++ - 使用文件流删除一行文本 (C++)