c++ 파일의 줄별 읽기와 문자 일치 실현

C++ 파일 읽기


우선 테스트에 사용할 txt 파일을 만듭니다. 예를 들어 다음과 같은 이름은mindspore입니다.txt 파일 (이 이름을 지은 이유는 최근에 마인드spore를 연구하고 있기 때문에 가장 쉽게 얻을 수 있는 데이터는 마인드spore의 핑계api 문서입니다):

MindSpore Python API
MindSpore Python API
mindspore
mindspore.common.initializer
mindspore.communication
mindspore.compression
mindspore.context
mindspore.dataset
mindspore.dataset.config
mindspore.dataset.text
mindspore.dataset.transforms
mindspore.dataset.vision
mindspore.explainer
mindspore.mindrecord
mindspore.nn
mindspore.numpy
mindspore.nn.probability
mindspore.ops
mindspore.profiler
mindspore.train
MindArmour Python API
mindarmour
mindarmour.adv_robustness.attacks
mindarmour.adv_robustness.defenses
mindarmour.adv_robustness.detectors
mindarmour.adv_robustness.evaluations
mindarmour.fuzz_testing
mindarmour.privacy.diff_privacy
mindarmour.privacy.evaluation
mindarmour.privacy.sup_privacy
mindarmour.utils
MindSpore Hub Python API
mindspore_hub
MindSpore Serving Python API
mindspore_serving
MindQuantum Python API
mindquantum
그리고 이 파일을 한 줄씩 읽는 데 사용할 C++ 코드를 만듭니다. getline 함수를 통해 가져온 줄 문자열을strline에 저장하고 한 줄을 읽을 때마다 화면에 출력합니다.while 순환을 사용하기 때문에 index 방안을 사용하여 순환을 뛰어넘는 조건을 설정하고 특정한 줄 범위만 읽습니다.

// iofile.cpp
#include <iostream>
#include <fstream>
#include <string>

int main()
{
    using namespace std;
    string filename="mindspore.txt";
    ifstream fin(filename.c_str());
    int index = 0;
    string strline;
    while (getline(fin, strline) && index < 20)
    {
        cout << strline << endl;
        index ++;
    }
    fin.close();
    cout << "Done!
"; return 0; }
읽기가 끝난 후,close () 를 사용하여 파일을 닫는 것을 기억하십시오.위 코드의 실행 결과는 다음과 같습니다.

dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ iofile.cpp 
dechin@ubuntu2004:~/projects/gitlab/dechin/$ ./a.out
MindSpore Python API
MindSpore Python API
mindspore
mindspore.common.initializer
mindspore.communication
mindspore.compression
mindspore.context
mindspore.dataset
mindspore.dataset.config
mindspore.dataset.text
mindspore.dataset.transforms
mindspore.dataset.vision
mindspore.explainer
mindspore.mindrecord
mindspore.nn
mindspore.numpy
mindspore.nn.probability
mindspore.ops
mindspore.profiler
mindspore.train
Done!
여기서 사용하는 g++ 버전은 9.3.0입니다.

dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ --version
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
상기 사례는 20줄의 내용을 읽었기 때문에 Linux에서 우리는 헤드를 통해 20줄의 파일 내용을 볼 수 있다.

dechin@ubuntu2004:~/projects/gitlab/dechin/$ head -n 20 mindspore.txt 
MindSpore Python API
MindSpore Python API
mindspore
mindspore.common.initializer
mindspore.communication
mindspore.compression
mindspore.context
mindspore.dataset
mindspore.dataset.config
mindspore.dataset.text
mindspore.dataset.transforms
mindspore.dataset.vision
mindspore.explainer
mindspore.mindrecord
mindspore.nn
mindspore.numpy
mindspore.nn.probability
mindspore.ops
mindspore.profiler
mindspore.train
비교를 통해 두 결과가 일치하는 것을 발견하였다.

C++ 문자열 일치


우리는 상술한 txt 텍스트에서 문자context가 있는 줄을 다른 줄과 다르게 표시하고자 하는 테스트 사례와 같다.이 때 C++의 문자열 일치 기능을 사용해야 합니다. 그 형식은string입니다.find ("context"), 되돌아오는 것은 식별 코드입니다. 존재 여부나 존재 위치를 표시하는 데 사용되며, 문자가 존재하지 않으면 되돌아오는 결과는string::npos와 같습니다.이 사고방식에 따라 우리는 검색 과정에서 context 문자를 만나면 1을 출력하고 그렇지 않으면 0을 출력한다. 구체적인 코드는 다음과 같다.

// iofile.cpp
#include <iostream>
#include <fstream>
#include <string>

int main()
{
    using namespace std;
    string filename="mindspore.txt";
    ifstream fin(filename.c_str());
    int index = 0;
    string strline;
    while (getline(fin, strline) && index < 20)
    {
        bool exists = strline.find("context") == string::npos;
        cout << strline << '\t' << !exists << endl;
        index ++;
    }
    fin.close();
    cout << "Done!
"; return 0; }
위 코드의 실행 결과는 다음과 같습니다.

dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ iofile.cpp && ./a.out
MindSpore Python API    0
MindSpore Python API    0
mindspore       0
mindspore.common.initializer    0
mindspore.communication 0
mindspore.compression   0
mindspore.context       1
mindspore.dataset       0
mindspore.dataset.config        0
mindspore.dataset.text  0
mindspore.dataset.transforms    0
mindspore.dataset.vision        0
mindspore.explainer     0
mindspore.mindrecord    0
mindspore.nn    0
mindspore.numpy 0
mindspore.nn.probability        0
mindspore.ops   0
mindspore.profiler      0
mindspore.train 0
Done!
우리는 context를 포함하는 줄의 끝에 1이 출력되고 다른 줄의 끝에 0이 출력된다는 것을 알 수 있다.

C++ 실행 시간 통계


python에서 우리가 자주 사용하는 기능 중 하나는 가져오는 시간입니다.시간 () 을 기록하여 두 번의 시간 사이의 차치를 계산하면 프로그램의 정확한 운행 시간을 얻을 수 있다.C++ 중 유사한 용법은 clock_t, 여기에서 테스트를 편리하게 하기 위해 우리는 상술한 코드를reader 함수에 봉인한 다음main 함수에서 호출하고 운행 시간을 통계합니다.

// iofile.cpp
#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
using namespace std;
int reader()
{
    string filename="mindspore.txt";
    ifstream fin(filename.c_str());
    int index = 0;
    string strline;
    while (getline(fin, strline) && index < 20)
    {
        bool exists = strline.find("context") == string::npos;
        cout << strline << '\t' << !exists << endl;
        index ++;
    }
    fin.close();
    cout << "Done!
"; return 0; } int main() { clock_t start, end; start = clock(); reader(); end = clock(); cout << "The time cost is: " << double(end-start)/CLOCKS_PER_SEC << "s" << endl; }
위 코드의 실행 결과는 다음과 같습니다.

dechin@ubuntu2004:~/projects/gitlab/dechin/$ g++ iofile.cpp && ./a.out
MindSpore Python API    0
MindSpore Python API    0
mindspore       0
mindspore.common.initializer    0
mindspore.communication 0
mindspore.compression   0
mindspore.context       1
mindspore.dataset       0
mindspore.dataset.config        0
mindspore.dataset.text  0
mindspore.dataset.transforms    0
mindspore.dataset.vision        0
mindspore.explainer     0
mindspore.mindrecord    0
mindspore.nn    0
mindspore.numpy 0
mindspore.nn.probability        0
mindspore.ops   0
mindspore.profiler      0
mindspore.train 0
Done!
The time cost is: 0.000245s
출력 시간은 이 함수의 운행 시간을 모두 0.2ms로 표시합니다.

요약


본고는 C++의 세 가지 기초 조작을 간단하게 소개했다. 한 줄씩 파일 내용을 읽고 문자열의 일치와 운행 시간의 통계를 분석하며 간단한 범례를 통해 이 세 가지 기본적인 기능을 실현했다.python에 비해 C++의 코드 작성량은 틀림없이 많을 것이다. 그러나 C++가 가져올 수 있는 효율 이득을 감안하여 우리도 그 기본적인 용법과 기능 실현을 이해해야 한다.
이상은 c++가 파일의 줄마다 읽기와 문자의 일치에 대한 상세한 내용입니다. c++ 파일의 줄마다 읽기와 문자의 일치에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기