如果文件中的行包含特定字符,则在C ++中查找

时间:2015-10-15 15:47:59

标签: c++ filestream

我已经阅读了文本文件中的行,我想检查该行是否包含$符号。

这就是我到目前为止所得到的:

int main() {

    ifstream data_store;
    string line;
    data_store.open("c:\\test.txt");


    while (!data_store.eof())
    {

        getline(data_store, line);
        if (line.find("$"))
        cout << "1: " << line << endl;
    }


    data_store.close();

    system("PAUSE");
    return 0;
}

此外,我如何将它们输出到文件?

3 个答案:

答案 0 :(得分:2)

要检查某行是否包含使用std::string::find的内容,需要检查来自find的返回值,以确保它是有效的返回值。为此,我们将其与std::string::npos进行比较,因为find()如果找不到任何内容将会返回std::string::npos。这就是当它被评估为bool时,它发现while (getline(data_store, line)) { if (line.find("$") != std::string::npos) cout << "1: " << line << endl; } 的每一行仍然被认为是真的原因。因此,重构您的代码:

eof

我也改变了while循环,因为使用@Service public class MessageService @Entity public class Message 不是如何控制while循环。有关详细信息,请参阅Why is “while ( !feof (file) )” always wrong?

只要将字符串输出到文件,请参阅:How to write std::string to file?

答案 1 :(得分:0)

这是一个小问题,但是@ NathanOliver解决方案的变体是使用for循环:

ifstream data_store("c:\\test.txt");

for ( string line; getline(data_store, line); ) {
  if ( line.find("$") != string::npos )
    cout << "1: " << line << endl;
}
// ...

这里的好处是line现在只对循环本地化,这应该是它应该是的,因为它是唯一使用它的地方。

答案 2 :(得分:0)

我昨天忘了更新了。

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

using namespace std;

bool contains_number(const string &c);



int main()
{
    int count = 0;
    {
        string line1[100];
        ifstream myfile("D:/Users/Jarvan/Desktop/test.txt");

        int a = 0;

        if (!myfile)
        {
            cout << "Error opening output file" << endl;
            system("pause");
            return -1;
        }

        while (!myfile.eof())
        {
            getline(myfile, line1[a], '\n');

            if (contains_number(line1[a]))
            {
                count += 1;
                cout << line1[a] << "\n";
            }
            else cout << "\n";
        }
    }

    cout << count <<endl;


    system("pause");
    return 0;
}



bool contains_number(const string &c)
{
    return (c.find_first_of("$") != string::npos);
}