0

1000文字を超える場合、INIファイルの行の読み取りをスキップしたい.これは私が使用しているコードです:

#define MAX_LINE 1000
char buf[MAX_LINE];
CString strTemp;
str.Empty();
for(;;)
{
    is.getline(buf,MAX_LINE);
    strTemp=buf;
    if(strTemp.IsEmpty()) break;
    str+=strTemp;

    if(str.Find("^")>-1)
    {
        str=str.Left( str.Find("^") );
        do
        {
            is.get(buf,2);
        } while(is.gcount()>0);
        is.getline(buf,2);
    }
    else if(strTemp.GetLength()!=MAX_LINE-1) break;

}
//is.getline(buf,MAX_LINE);
return is;

...

私が直面している問題は、文字数が 1000 を超えると、無限ループに陥るように見える (次の行を読み取れない) ことです。getline でその行をスキップして次の行を読み取るにはどうすればよいですか??

4

3 に答える 3

1
const std::size_t max_line = 1000;  // not a macro, macros are disgusting

std::string line;
while (std::getline(is, line))
{
  if (line.length() > max_line)
    continue;
  // else process the line ...
}
于 2012-05-17T16:25:30.633 に答える
0

完全に異なる場合:

std::string strTemp;
str.Empty();
while(std::getline(is, strTemp)) { 
    if(strTemp.empty()) break;
    str+=strTemp.c_str(); //don't need .c_str() if str is also a std::string

    int pos = str.Find("^"); //extracted this for speed
    if(pos>-1){
        str=str.Left(pos);
        //Did not translate this part since it was buggy
    } else
        //not sure of the intent here either
        //it would stop reading if the line was less than 1000 characters.
}
return is;

これは使いやすさのために文字列を使用し、行数に上限はありません。またstd::getline、動的/魔法のすべてに を使用しますが、非常にバグがあるように見え、意図を解釈できなかったため、途中のビットを翻訳しませんでした。

中間の部分は、ファイルの最後に到達するまで一度に 2 文字を読み取るだけで、それ以降は戻り値をチェックしていないため、奇妙なことが行われます。完全に間違っていたので、解釈しませんでした。

于 2012-05-17T16:34:18.710 に答える
0

戻り値をチェックして、getlineそれが失敗した場合に中断するにはどうすればよいですか?

..isまたは istream の場合、 eof() 条件をチェックして、あなたを打ち破ることができます。

#define MAX_LINE 1000
char buf[MAX_LINE];
CString strTemp;
str.Empty();
while(is.eof() == false)
{
    is.getline(buf,MAX_LINE);
    strTemp=buf;
    if(strTemp.IsEmpty()) break;
    str+=strTemp;

    if(str.Find("^")>-1)
    {
        str=str.Left( str.Find("^") );
        do
        {
            is.get(buf,2);
        } while((is.gcount()>0) && (is.eof() == false));
        stillReading = is.getline(buf,2);
    }
    else if(strTemp.GetLength()!=MAX_LINE-1)
    {
        break;
    }
}
return is;
于 2012-05-17T11:42:15.913 に答える