这个TXT文件怎么读到数组中?

gbjsy 2019-05-27 12:35:50
数组是这样的:
BOOL Acheck[10][3];
CString Bdata[3];
CString Cdata[3];
TXT文件是这样写入的:
void Dxwenjian::WriteText1()//写入文件
{
CString djtxt = "aa.txt";
CFile TXTFile;
TXTFile.Open(djtxt, CFile::modeCreate | CFile::modeReadWrite);

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 10; j++)
{
TXTFile.Write(&listsz.Acheck[j][i],1) ;
}
TXTFile.Write("\r\n", 2);
}
for (int i = 0; i < 3; i++)
{
CString str = listsz.Bdata[i];
str = str + "\r\n";
TXTFile.Write(str, str.GetLength());
}
for (int i = 0; i < 3; i++)
{
CString str = listsz.Cdata[i];
str = str + "\r\n";
TXTFile.Write(str, str.GetLength());
}
TXTFile.Close();
}

数组在其他函数已赋值。写出来的文件是这样:


怎么把TXT文件内容准确读回到上面的三个数组中。
...全文
149 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gbjsy 2019-05-28
  • 打赏
  • 举报
回复
我正在研读其他的代码部分,初学mfc,见笑了。
gbjsy 2019-05-28
  • 打赏
  • 举报
回复
首先谢谢schlafenhamster老师的持续指导:
我改成了下面的样子:
for (int k = 0; k < sizeof(listsz.Acheck) / (10*sizeof(listsz.Acheck[0][0])); k++)成功

而且我删除了afxDump语句,好像它只是把内容信息发送到调试器输出窗口,结果也正确。
schlafenhamster 2019-05-28
  • 打赏
  • 举报
回复
for (int k = 0; k < sizeof(Acheck2)/10; k++)这里除以10不够
与 Acheck2 类型有关
应该是 sizeof(Acheck2)/(10*sizeof(。。。))
注意
afxDump << sizeof(BOOL) << "\n"; // 4
afxDump << sizeof(bool) << "\n"; // 1
afxDump << sizeof(BYTE) << "\n"; // 1
走好每一步 2019-05-27
  • 打赏
  • 举报
回复
引用 楼主 gbjsy 的回复:
数组是这样的: BOOL Acheck[10][3]; CString Bdata[3]; CString Cdata[3]; TXT文件是这样写入的:
void Dxwenjian::WriteText1()//写入文件
{
	CString djtxt = "aa.txt";
	CFile TXTFile;
	TXTFile.Open(djtxt, CFile::modeCreate | CFile::modeReadWrite);

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			TXTFile.Write(&listsz.Acheck[j][i],1) ;
		}
		TXTFile.Write("\r\n", 2);
	}
	for (int i = 0; i < 3; i++)
	{
		CString str = listsz.Bdata[i];
		str = str + "\r\n";
		TXTFile.Write(str, str.GetLength());
	}
	for (int i = 0; i < 3; i++)
	{
		CString str = listsz.Cdata[i];
		str = str + "\r\n";
		TXTFile.Write(str, str.GetLength());
	}
	TXTFile.Close();
}
数组在其他函数已赋值。写出来的文件是这样: 怎么把TXT文件内容准确读回到上面的三个数组中。
你这个就是序列化,建议使用tinyxml
sichuanwww 2019-05-27
  • 打赏
  • 举报
回复
小技巧:教您如何更快获得可用分
schlafenhamster 2019-05-27
  • 打赏
  • 举报
回复
k < sizeof(Acheck2)/10;// =3 即 [10][3]
gbjsy 2019-05-27
  • 打赏
  • 举报
回复
太谢谢schlafenhamster老师了,这个对于TXT文件可查看编辑读写非常好,完美解决了我的问题,经过调试发现for (int k = 0; k < sizeof(Acheck2)/10; k++)这里除以10不够,要除以3*10+10也就是40才行。虽然问题完美解决了,但你的代码我还需要一些时间消化理解,谢谢你的帮助。
schlafenhamster 2019-05-27
  • 打赏
  • 举报
回复
“方框和空格” 是 不可以 编辑 的 ! 还是要 写成 “01”
schlafenhamster 2019-05-27
  • 打赏
  • 举报
回复

BYTE Acheck2[10][3];
CString Bdata[3];
CString Cdata[3];

void ReadText()
{
CString txt = "aa.txt";
CStdioFile TXTFile;
TXTFile.Open(txt, CFile::modeRead);
//
for (int k = 0; k < sizeof(Acheck2)/10; k++)
{
CString Checks;
TXTFile.ReadString(Checks);
// afxDump << Checks << " Checks\n";
int all=Checks.GetLength();//=10
for(int m=0;m<all;m++)
{
BYTE t=Checks.GetAt(m);
t-='0';
Acheck2[m][k]=t;
afxDump << Acheck2[m][k];
}
afxDump << "\n" ;
}
//
for (int i = 0; i < sizeof(Bdata)/sizeof(CString); i++)
{
TXTFile.ReadString(Bdata[i]);
afxDump << Bdata[i] << " Bdata[]\n";
}
for (int j = 0; j < sizeof(Cdata)/sizeof(CString); j++)
{
TXTFile.ReadString(Cdata[j]);
afxDump << Cdata[j] << " Cdata[]\n";
}
TXTFile.Close();
}
Eleven 2019-05-27
  • 打赏
  • 举报
回复
CStdioFile
while(file::ReadString(strText))
{
// Debug下单步,应该每行对应你txt文件中的一行数据
}
gbjsy 2019-05-27
  • 打赏
  • 举报
回复
引用 6 楼 Eleven 的回复:
你怎么写的就怎么读~

怎么写进去的我很清楚,可同样的方法读出来, Bdata[3]和Cdata[3]里面就没有了,全为空。我去掉TXTFile.Write("\r\n", 2);这一行也就是为了读的时候不去处理"\r\n"换行符,我也处理不了它。不去掉那一行换行符会跑到Acheck[1][0]和Acheck[1][1]去。
gbjsy 2019-05-27
  • 打赏
  • 举报
回复
谢谢schlafenhamster老师的多次帮助支持,看来前三行的读取难度不小。我去掉了TXTFile.Write("\r\n", 2);这一行,由他读出来的方框和空格一行写完,因为这样我可以很容易读出来。我用下面的循环读出来的,数组 BOOL Acheck[10][3] 得值是正确的。
	for (int i = 0; i < 3; i++)
{
for (int j = 0; j <10; j++)
{
TXTFile.Read(&listsz.Acheck[j][i], 1);
}
}

可是执行完这个循环后,怎么写循环代码才能把第二行以下的字符串继续读出到 Bdata[3]和Cdata[3],这个是我的最大难点,还望老师给个方法。
Eleven 2019-05-27
  • 打赏
  • 举报
回复
你怎么写的就怎么读~
schlafenhamster 2019-05-27
  • 打赏
  • 举报
回复
CString Bdata[3];
CString Cdata[3];

void ReadText()
{
CString txt = "aa.txt";
CStdioFile TXTFile;
TXTFile.Open(txt, CFile::modeRead);
for (int i = 0; i < sizeof(Bdata)/sizeof(CString); i++)
{
TXTFile.ReadString(Bdata[i]);
afxDump << Bdata[i] << " Bdata[]\n";
}
for (int j = 0; j < sizeof(Cdata)/sizeof(CString); j++)
{
TXTFile.ReadString(Cdata[j]);
afxDump << Cdata[j] << " Cdata[]\n";
}
TXTFile.Close();
}
gbjsy 2019-05-27
  • 打赏
  • 举报
回复
怎么说这个呢,一行一行读,我添加的回车换行符怎么处理,读完三行,第四行字符串怎么跳到带二个数组去循环,给个框架写法啊。
待续_1006 2019-05-27
  • 打赏
  • 举报
回复
用CStdioFile::ReadString函数一行一行读取txt里面的文件,然后你就可以随心所欲的来处理这一行数据了
gbjsy 2019-05-27
  • 打赏
  • 举报
回复
引用 1 楼 走好每一步的回复:
[quote=引用 楼主 gbjsy 的回复:] 数组是这样的: BOOL Acheck[10][3]; CString Bdata[3]; CString Cdata[3]; TXT文件是这样写入的:
void Dxwenjian::WriteText1()//写入文件
{
	CString djtxt = "aa.txt";
	CFile TXTFile;
	TXTFile.Open(djtxt, CFile::modeCreate | CFile::modeReadWrite);

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			TXTFile.Write(&listsz.Acheck[j][i],1) ;
		}
		TXTFile.Write("\r\n", 2);
	}
	for (int i = 0; i < 3; i++)
	{
		CString str = listsz.Bdata[i];
		str = str + "\r\n";
		TXTFile.Write(str, str.GetLength());
	}
	for (int i = 0; i < 3; i++)
	{
		CString str = listsz.Cdata[i];
		str = str + "\r\n";
		TXTFile.Write(str, str.GetLength());
	}
	TXTFile.Close();
}
数组在其他函数已赋值。写出来的文件是这样: 怎么把TXT文件内容准确读回到上面的三个数组中。
你这个就是序列化,建议使用tinyxml[/quote] 这个不会搞,好像还要安装什么东西,头大。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧