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 个字符宽,您可以检查第三个字符是否为,. 否则,您可以向后扫描第一行文本以查看第一个非货币相关字符是否为,.

编辑: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
#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 回答
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 回答