我是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);
}
}
答案 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;
}
顺便说一句:我不是正则表达式专家所以验证表达式: - )