我正在尝试读取以';'分隔的数据进入一个结构数组,所以我以后可以过滤它们。 示例数据:
1.1 ; name1; 11-07-2014; 14:30
1.2 ; name2; 11-07-2017; 15:10
我不知道这个.txt文件中会有多少条目。此外,我需要添加一个可用性来选择用户想要工作的文件(这是有效的)我是c ++的新手,所以我会感激任何提示。
到目前为止,我已创建了这个:
typedef struct{
char numb[21];
char names[100];
char date[11];
char time[6];
}vec;
vec *logs[200];
void_fastcall TForm1::Button1Click(TObject *Sender)
{
OPENFILENAME ofn;
char fname[MAX_PATH] ="";
ZeroMemory( & ofn, sizeof( ofn ) );
ofn.lStructSize = sizeof( ofn );
ofn.lpstrFilter = "Text files (*.txt)\0*.txt\0All files\0*.*\0";
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFile = fname;
ofn.lpstrDefExt = "txt";
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
string line;
if( GetOpenFileName( & ofn ) )
{
for(int i=0; i<200; i++){
getline(fname, logs[i].numb, ';');
getline(fname, logs[i].names, ';');
getline(fname, logs[i].date, ';');
getline(fname, logs[i].time, ';');
}
}
}
我收到了这个错误 E2285找不到匹配的'getline&lt; _CharT,_Traits,_Alloc&gt;(char *,undefined,char)'
答案 0 :(得分:0)
我对你的代码感到困惑。 fname
是一个LPTSTR,所以是一个字符串。这应该如何与getline一起使用?
我知道的唯一获取行函数是:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
或:
std::istream& std::getline(std::istream& is, std::string& str, char delim);
std::istream& std::getline(std::istream& is, std::string& str);
由于您使用GetOpenFileName
,因此您在Windows上,这意味着您只能使用更晚的版本。无论如何,你需要实际打开一个文件进行阅读。
怎么样:
struct vec{
std::string numb;
std::string names;
std::string date;
std::string time;
};
std::vector<vec> logs;
size_t i = 0;
std::ifstream in(fname);
while (in.good() && i < 200)
{
std::string line;
getline(in, line);
std::vector<std::string> bits = explode(line, ";");
assert(bits.size() == 4);
vec v = {bits[0], bits[1], bits[2], bits[3]};
logs.push_back(v);
i++;
}
这是我方便的爆炸功能:
std::vector<std::string> explode(const std::string& str, const std::string& delimiter)
{
std::vector<std::string> gibs;
size_t start = 0;
size_t end = 0;
while ((start != std::string::npos) && (start < str.size()))
{
end = str.find(delimiter, start);
std::string gib;
if (end == std::string::npos)
{
gib = str.substr(start);
start = std::string::npos;
}
else
{
gib = str.substr(start, end - start);
start = end + delimiter.size();
}
gibs.push_back(gib);
}
return gibs;
}
如果你想编写C或C ++,最后下定决心。混合两者绝不是一个好主意。