大家好我是C ++ MFC初学者,我希望通过继承CStdioFile类来了解如何在C ++ MFC中读取.CSV文件内容。
该文件包含以下数据:
AAAAAAAAA; BBBBBBB; CCCCCCC; DDDDDDDD; EEEEEEEE; FFFFFFFF;等...
AAAAAAAA直接是没有“”的字符串 例如:test1; test2; ...
并在现实中表示excel中的值。
我想要的是创建一个新的阅读器函数,其中包含两个读入文件的参数(行和列)并提取好的值并将其作为CString返回
目前这是我所拥有的一段代码:
CString ReadData(int rl, int rc)
{
CString sLine;
LPCTSTR p = sLine;
unsigned int i=1;
unsigned int j=1;
CString s;
while(*p!= EOF)
{
if(*p==';' && i==rl)
s.AppendChar(*p);
if(*p=='\n')
i++;
p++;
}
return s;
}
这不起作用,尚未完成。
我想要的是帮助知道在文件中执行该操作的方法,如何检测文件的结尾(通常是EOF值?),行尾('\ n'?),我是否必须在一行中存储不同的字符串?当然,也欢迎代码中的一些帮助。
答案 0 :(得分:2)
一次读取一个字符的文件很慢,你可以读入一个字符串中的较大块。只要文件不是太大,这就可以工作。然后将该字符串标记为不同的行,并将每行标记为不同的字段。
顺便说一下,你要求"分号分隔值"不是csv,所以将','
更改为';'
void tokenize(vector<CStringA> &v, const CStringA &source, char token)
{
for (int start = 0, len = source.GetLength(); start < len;)
{
int end = source.Find(token, start);
if (end < 0) end = len;
v.push_back(source.Mid(start, end - start));
start = end + 1;
}
}
void foo()
{
CStringA source; //read the whole file in to one string "source"
const int bufsize = 512 + 1;
char buf[bufsize];
CFile file("files.csv", CFile::modeRead|CFile::typeBinary);
int count;
while ((count = file.Read(buf, bufsize - 1)) > 0) {
buf[count] = 0;
source += buf;
}
source.Remove('\r');
vector<CStringA> lines; //tokenize in to separate lines and store in vector
tokenize(lines, source, '\n');
for (int row = 0; row < (int)lines.size(); row++) {
vector<CStringA> fields; //tokenize in to different fields
tokenize(fields, lines[row], ',');
for (int column = 0; column < (int)fields.size(); column++)
TRACE("%s|", fields[column]); //print each field for testing
TRACE("\n");
}
}