C ++如何在此文本文件中检查分隔符

时间:2012-08-06 09:58:13

标签: c++

我是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);

    }
}

3 个答案:

答案 0 :(得分:0)

您需要一种可靠的方法来查找您始终期望分隔符的位置。如果第一个字段的宽度始终为2个字符,则可以检查3 rd 字符是否为,。否则,您可以向后扫描第一行文本,以查看第一个与非货币相关的字符是否为,

编辑:您的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));
    }
}

答案 1 :(得分: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
}

编辑:添加评论&amp;示例代码

答案 2 :(得分: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;
}

顺便说一句:我不是正则表达式专家所以验证表达式: - )