gpt4 book ai didi

c++ - 在 MFC 中读取 .CSV 文件内容

转载 作者:行者123 更新时间:2023-11-28 02:27:21 25 4
gpt4 key购买 nike

大家好,我是 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'?),我是否必须在一行中存储不同的字符串?当然也欢迎在代码中提供一些帮助。

最佳答案

一次一个字符读取文件很慢,您可以将较大的 block 读取到一个字符串中。只要文件不是太大,这就有效。然后将该字符串标记为不同的行,并将每一行标记为不同的字段。

顺便说一下,您要求的是“分号分隔值”而不是 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");
}
}

关于c++ - 在 MFC 中读取 .CSV 文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30087876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com