-1

プログラムをヘッダー ファイルとメイン ファイルに分割しようとしましたが、ヘッダー ファイルがこれでどのように機能するのか正確にはわかりません。これを理解するための助けをいただければ幸いです。

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


void comparing(std::ifstream& fileIn, std::ifstream& keywords, std::ofstream& outFile)
{
    std::string str;
    std::string word;
    std::set<std::string> keywordsSet;
        int check = 0;

        while (keywords >> word) {
        keywordsSet.insert(word);
        }

    while(fileIn >> str){

        if(str == "<p>") {
            check++;
        }


        if((check > 1 && str == "<p>") || (check == 1 && str == "</body>"))
        {
            outFile << "</p>";
            check--;
        }



    if(keywordsSet.find(str) != keywordsSet.end()) {

        outFile << "<i>" << str << "</i>" << " ";
        }

        else{
        outFile << str << " ";
        }           
    }   

}
int main(int argc, char* argv[])
{

std::ifstream fileIn;
fileIn.open (argv[1]);

std::ifstream keywords;
keywords.open (argv[2]);

std::ofstream outFile;
outFile.open(argv[3]);

    comparing(fileIn, keywords, outFile);

fileIn.close();
keywords.close();
outFile.close();

return 0;
}
4

2 に答える 2

2

コードでは、1 つの関数を宣言します: comparing. 通常、すべての宣言をヘッダー ファイル (MSVC++ は.hサフィックスを使用しますが、私.hppは C++ ヘッダーを好みます) に配置し、実装を.cppファイルに配置します。

ヘッダー ( comparing.hpp、またはそれらの行に沿ったもの) は次のようになります。

// Prevents redefinitions when including the same header multiple times
#pragma once

// Does the same thing, just to make sure 
// (some compilers don't support #pragma once)
#ifndef COMPARING_HPP
#define COMPARING_HPP

#include <fstream>

void comparing(std::ifstream&, std::ifstream&, std::ofstream&); // Function prototype

#endif

comparing.cppファイルは次のようになります。

#include "comparing.hpp"
// Note the quotation marks instead of greater than, less than signs
// This is because the header is not in the standard include path,
// but rather in your project include path.

// Implementation, belongs in cpp file
void comparing(std::ifstream& fileIn, std::ifstream& keywords, std::ofstream& outFile)
{
    std::string str;
    std::string word;
    std::set<std::string> keywordsSet;
        int check = 0;

        while (keywords >> word) {
        keywordsSet.insert(word);
        }

    while(fileIn >> str){

        if(str == "<p>") {
            check++;
        }


        if((check > 1 && str == "<p>") || (check == 1 && str == "</body>"))
        {
            outFile << "</p>";
            check--;
        }



    if(keywordsSet.find(str) != keywordsSet.end()) {

        outFile << "<i>" << str << "</i>" << " ";
        }

        else{
        outFile << str << " ";
        }           
    }   

}

そして、ヘッダーを含める限り、compare関数を任意の で使用できます。.cppしたがって、main.cpp* ファイルは次のようになります。

#include "comparing.hpp"

int main(int argc, char* argv[])
{

std::ifstream fileIn;
fileIn.open (argv[1]);

std::ifstream keywords;
keywords.open (argv[2]);

std::ofstream outFile;
outFile.open(argv[3]);

    comparing(fileIn, keywords, outFile);

fileIn.close();
keywords.close();
outFile.close();

return 0;
}

**main.cppファイルにヘッダーは必要ありません。mainコードの他の場所で呼び出す必要があるのはなぜですか?

于 2013-02-03T10:22:54.440 に答える
0

通常、クラスと関数の宣言をヘッダーに配置してから.cpp、定義と実装をファイルに配置します。

于 2013-02-03T10:13:34.513 に答える