0

私はC++が初めてです。区切り文字をチェックする関数を作成する方法を知りたいです。

以下の場合など

AD,Andorra,AN,AD,AND,20.00,Andorra la Vella,Europe,Euro,EUR,67627.00
AE,United Arab Emirates,AE,AE,ARE,784.00,Abu Dhabi,Middle East,UAE Dirham,AED,2407460.00
AF,Afghanistan,AF,AF,AFG,4.00,Kabul,Asia,Afghani,AFA,26813057.00

区切り文字がカンマではなく $ または # になった場合、それをチェックして、テキスト ファイルの形式が間違っていると言う関数を作成するにはどうすればよいですか。

ありがとう!

以下は私のreadDataコードです

void readData ()
{
    FILE * pFile;
    NoOfRecordsRead = 0;
    char buffer [Line_Char_Buffer_Size];

    pFile = fopen (INPUT_FILE_NAME , "r");

    if (pFile == NULL) 
        perror ("Error opening file 'Countries.txt' !");
    else
    {
        while ( !feof (pFile) )
        {
            char* aLine = get_line (buffer, Line_Char_Buffer_Size, pFile);

            if (aLine != NULL)
            {
//              printf ("%d] aLine => %s\n", NoOfRecordsRead, aLine);
                globalCountryDataArray [NoOfRecordsRead++] = createCountryRecord (aLine);
            }
        }

     fclose (pFile);

    }
}
4

3 に答える 3

0

区切り文字が常に期待される場所を見つけるための信頼できる方法が必要です。最初のフィールドが常に 2 文字幅の場合、3番目の文字が,. それ以外の場合は、テキストの最初の行を逆方向にスキャンして、通貨に関連しない最初の文字が,.

編集:readDataコメントで指摘されているように、あなたのルーチンは非常にC中心です。C++ 機能を使用すると、大幅に簡素化できます。

std::string aLine;
std::ifstream pfile(INPUT_FILE_NAME);
while (pfile) {
    std::getline(pfile, aLine);
    if (aLine.size()) {
        globalCountryDataArray.push_back(createCountryRecord(aLine));
    }
}
于 2012-08-06T10:06:42.840 に答える
0

チェックを実行する良い方法は、Boost.Regex ライブラリを使用することです。正規表現を定義し、入力が表現と一致するかどうかをチェックするだけです。

サンプルコード:

#include <string>
#include <boost/regex.hpp>

using namespace std;

int main()
{
  const string input("AD,Andorra,AN,AD,AND,20.00,Andorra la Vella,Europe,Euro,EUR,67627.00");
  const boost::regex ex("(?:(?!,)(\\d+\\.\\d*)|(\\w|\\s)*)(,(?:(?!,)(\\d+\\.\\d*)|(\\w|\\s)*))*");
  cout << boost::regex_match(input.c_str(), ex) << endl;
  return 0;
}

ちなみに、私は正規表現の専門家ではないので、式を検証してください:-)

于 2012-08-06T10:49:00.723 に答える
0
#include <string>
#include <fstream>
#include <algorithm>

bool detect_comma(std::string file_name)
{
    // open C++ stream to file
    std::ifstream file(file_name.c_str());
    // file not opened, return false
    if(!file.is_open()) return false;
    // read a line from the file       
    std::string wtf;
    std::istream &in= std::getline(file, wtf);
    // unable to read the line, return false
    if(!in) return false;
    // try to find a comma, return true if comma is found within the string
    return std::find(wtf.begin(), wtf.end(), ',')!= wtf.end();
}


#include <iostream>
#include <cstdlib>

int main()
{
     if(!detect_comma("yourfile.dat"))
     {
         std::cerr<< "File is not comma delimited!\n";
         return EXIT_FAILURE;
     }
     // file is OK, open it and start reading
}

編集:コメントとサンプルコードを追加

于 2012-08-06T10:17:48.290 に答える