将字符串与ifstream :: getline生成的字符串进行比较

时间:2012-01-24 04:35:47

标签: c++ string input ifstream

我正在开发一个项目,我需要阅读postscript并解析文件中的数据以在我的程序中使用。我正在开发一个函数来测试postscript是否有效,确保它有开始和结束分隔符。

下面是我为完成此任务而编写的代码段。我相信postscript文件中没有额外的空格或任何类型的东西导致delimitStr和lineStr之间的任何差异。我还试图将delimitStr设置为“%%% BEGIN \ 0”和“%%% BEGIN”,但比较永远不会有效。

string lineStr;
bool beginFlag = false; //Switches to true when begin statement in postscript is found
string delimitStr = "%%%BEGIN"; //Starts as opening  delimiter. Switches to closing when opening is found.
while(psfile) {
    getline(psfile, lineStr);
    if(!beginFlag && lineStr == delimitStr) {
        beginFlag = true;
        delimitStr = "%%%END";
        cerr << "Begin found." << endl;
    }
    else if(beginFlag && lineStr == delimitStr)
        return true; //Only return true if file has beginning and ending delimiters.

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

delimitStr更改为delimitStr = "%%%BEGIN";,因为getline会丢弃'\n' 和 比较像lineStr == delimitStr这样的字符串。 请勿将字符串与c_str()进行比较,因为它会返回const char*

显示差异的示例:

std::string s1("%%%BEGIN");
std::string s2("%%%BEGIN\n");
std::string s3("%%%BEGIN\0"); // Same as s1 because std::string stops at '\0'

std::cout << std::boolalpha << (s1 == s2) << '\n';      // Outputs: false
std::cout << (s1 == s3) << '\n';      // Outputs: true 
std::cout << (s2 == s3) << std::endl; // Outputs: false