文本文件 txt,csv等"/>
CAPL读写文本文件 txt,csv等
📙 相关文章
-
🚩从零开始学习CANoe 系列文章目录汇总,点击跳转👇
-
🚩本章节内容演示源码下载,点击跳转👇
📘前言
- 🍅本节内容,我们来逐个解读下CAPL内置的文本操作函数
- 🍅演示软硬件环境 Win10 x64 ; CANoe 11 SP2 x64
目录
- 📙 相关文章
- 📘前言
- 📗 读取文件(openFileRead)
- 📙📙 二进制的方式读取文件(fileGetBinaryBlock )
- 📙📙 以字符串方式读取(fileGetString)
- 📙📙 以字符串方式2读取(fileGetStringSZ)
- 📗 写入文件(openFileWrite)
- 📙📙 以二进制方式写入 (fileWriteBinaryBlock )
- 📙📙 字符串方式写入(filePutString)
- 📙📙 覆盖写入(fileRewind )
- 🌎总结
📗 读取文件(openFileRead)
- 1️⃣ dword openFileRead (char filename[], dword mode);
- If mode=0 the file is opened in ASCII mode;
- if mode=1 the file is opened in binary mode.
📙📙 二进制的方式读取文件(fileGetBinaryBlock )
- 1️⃣ long fileGetBinaryBlock (byte buff[], long buffsize, dword fileHandle)
以二进制的方式打开文件,读取文件。
- 2️⃣ 简单代码演示
/*@!Encoding:1252*/
variables
{dword glbHandle,glbHandle1 = 0; long mNewPage; // Sink identifier
}on start
{
//Create a new page at the Write Window
mNewPage= writeCreate("New Page");
//Configure the page so that its content is logged
writeConfigure(mNewPage, 20, 1, "c:\\temp\\writelog.TXT");
//Clear content of CAPL page
writeclear(1);
writeLineEx(mNewPage,4,"\nKeyboard sequence: ");
}
On key 'w'
{ byte buffer_bin[10];long retSize;int i;// Opens the file in binary mode for read access.glbHandle = OpenFileRead ("C:\\Data.txt",1);if ( glbHandle!=0 ){do{retSize = fileGetBinaryBlock(buffer_bin,elcount(buffer_bin),glbHandle);writeLineEx(mNewPage,1,"retSize:%d",retSize);for(i=0;i< retSize;i++)writeLineEx (mNewPage,1,"buffer_bin[%d]: %d.",i,buffer_bin[i]);}while(retSize > 0); fileClose (glbHandle); }on StopMeasurement
{writeDestroy(mNewPage);fileClose (glbHandle);
}
-
3️⃣ 读取结果和Data.txt 对比
-
Data.txt 的数据如下:
- ASCii 对照表
- 输出结果
Keyboard sequence:
retSize:10
buffer_bin[0]: 49.
buffer_bin[1]: 50.
buffer_bin[2]: 51.
buffer_bin[3]: 52.
buffer_bin[4]: 13.
buffer_bin[5]: 10.
buffer_bin[6]: 53.
buffer_bin[7]: 54.
buffer_bin[8]: 55.
buffer_bin[9]: 56.
retSize:10
buffer_bin[0]: 13.
buffer_bin[1]: 10.
buffer_bin[2]: 97.
buffer_bin[3]: 98.
buffer_bin[4]: 99.
buffer_bin[5]: 100.
buffer_bin[6]: 13.
buffer_bin[7]: 10.
buffer_bin[8]: 101.
buffer_bin[9]: 102.
retSize:2
buffer_bin[0]: 103.
buffer_bin[1]: 104.
retSize:0
⚠️注意点⚠️:
- buffer_bin[4]: 13.buffer_bin[5]: 10. 对应ASCII表中看出,会多打印出回车和换行
- retSize:10 ,retSize:10,retSize:2,retSize:0
因为定义的buffer_bin[10],读取最大的字符就是10个,retSize:2说明读取完毕了,且只读了两个字符,且如果读取完毕了,不会再打印13,10. - 接收读取字符 只能定义为byte 类型
📙📙 以字符串方式读取(fileGetString)
变异函数为:long fileGetStringSZ(char buff[], long buffsize, dword fileHandle);
fileGetString
:会把行结束符(10),回车(13)也输入到接收buffer内fileGetStringSZ
:不会把行结束符(10),回车(13)也输入到接收buffer内
- 1️⃣
fileGetString
字符串格式输出打印
On key 'q'
{ char buffer_ascii[10];long retSize;int i,j;glbHandle = OpenFileRead (file_path,0);if ( glbHandle!=0 ){ j=0;while(fileGetString (buffer_ascii,elcount(buffer_ascii),glbHandle)!=0) {// %s 打印writeLineEx (mNewPage,1,"lineNum:%d string: %s.",j,buffer_ascii);j++;
// for(i=0;i< 6;i++)
// writeLineEx (mNewPage,1,"buffer_bin[%d]: %d.",i,buffer_ascii [i]);}fileClose (glbHandle); } }
输出: (注意每行输出之后都换行了,这是因为使用fileGetString 函数会把文件中的航结束符合换行符也算)
Keyboard sequence:
lineNum:0 string: 1234
.
lineNum:1 string: 5678
.
lineNum:2 string: abcd
.
lineNum:3 string: efgh.
- 2️⃣fileGetString 单个字符输出打印(为了凸显换行符)
On key 'q'
{char buffer_ascii[10];long retSize;int i,j;glbHandle = OpenFileRead (file_path,0);if ( glbHandle!=0 ){j=0;while(fileGetString (buffer_ascii,elcount(buffer_ascii),glbHandle)!=0) {// writeLineEx (mNewPage,1,"lineNum:%d string: %s.",j,buffer_ascii);
// j++;//单个字符%d打印for(i=0;i< 6;i++)writeLineEx (mNewPage,1,"buffer_bin[%d]: %d.",i,buffer_ascii [i]);}fileClose (glbHandle); }
}
输出:
buffer_bin[0]: 49.
buffer_bin[1]: 50.
buffer_bin[2]: 51.
buffer_bin[3]: 52.
buffer_bin[4]: 10. // 换行,如果打开文件的方式是二进制打开,这里还会有回车符(13),参考上一个实例
buffer_bin[5]: 0.
buffer_bin[0]: 53.
buffer_bin[1]: 54.
buffer_bin[2]: 55.
buffer_bin[3]: 56.
buffer_bin[4]: 10.// 换行
buffer_bin[5]: 0.
buffer_bin[0]: 97.
buffer_bin[1]: 98.
buffer_bin[2]: 99.
buffer_bin[3]: 100.
buffer_bin[4]: 10.// 换行
buffer_bin[5]: 0.
buffer_bin[0]: 101.
buffer_bin[1]: 102.
buffer_bin[2]: 103.
buffer_bin[3]: 104.
buffer_bin[4]: 0.
buffer_bin[5]: 0.
📙📙 以字符串方式2读取(fileGetStringSZ)
fileGetString
:会把行结束符(10),回车(13)也输入到接收buffer内fileGetStringSZ
:不会把行结束符(10),回车(13)也输入到接收buffer内
- 1️⃣
fileGetStringSZ
字符串格式输出打印
On key 'd'
{char buffer_ascii[10];long retSize;int i,j;glbHandle = OpenFileRead (file_path,0);if ( glbHandle!=0 ){j=0;while(fileGetStringSZ (buffer_ascii,elcount(buffer_ascii),glbHandle)!=0) {writeLineEx (mNewPage,1,"lineNum:%d string: %s.",j,buffer_ascii);j++;
// for(i=0;i< 6;i++)
// writeLineEx (mNewPage,1,"buffer_bin[%d]: %d.",i,buffer_ascii [i]);}fileClose (glbHandle); }
}
输出:
lineNum:0 string: 1234.
lineNum:1 string: 5678.
lineNum:2 string: abcd.
lineNum:3 string: efgh.
- 2️⃣ fileGetStringSZ 单个字符输出打印(为了凸显换行符)
On key 'd'
{ char buffer_ascii[10];long retSize;int i,j;glbHandle = OpenFileRead (file_path,0);if ( glbHandle!=0 ){j=0;while(fileGetStringSZ (buffer_ascii,elcount(buffer_ascii),glbHandle)!=0) {
// writeLineEx (mNewPage,1,"lineNum:%d string: %s.",j,buffer_ascii);
// j++;//单个字符%d打印for(i=0;i< 6;i++)writeLineEx (mNewPage,1,"buffer_bin[%d]: %d.",i,buffer_ascii [i]);}fileClose (glbHandle); }
}
输出:(对比fileGetString 可以发现没了 换行字符(10))
buffer_bin[0]: 49.
buffer_bin[1]: 50.
buffer_bin[2]: 51.
buffer_bin[3]: 52.
buffer_bin[4]: 0.
buffer_bin[5]: 0.
buffer_bin[0]: 53.
buffer_bin[1]: 54.
buffer_bin[2]: 55.
buffer_bin[3]: 56.
buffer_bin[4]: 0.
buffer_bin[5]: 0.
buffer_bin[0]: 97.
buffer_bin[1]: 98.
buffer_bin[2]: 99.
buffer_bin[3]: 100.
buffer_bin[4]: 0.
buffer_bin[5]: 0.
buffer_bin[0]: 101.
buffer_bin[1]: 102.
buffer_bin[2]: 103.
buffer_bin[3]: 104.
buffer_bin[4]: 0.
buffer_bin[5]: 0.
📗 写入文件(openFileWrite)
dword openFileWrite (char filename[], dword mode)
;- 需要先设置打开文件的路径 setFilePath(),不可以直接setFilePath(“C:\”, 2); 因为对C根目录操作需要管理员权限。
📙📙 以二进制方式写入 (fileWriteBinaryBlock )
long fileWriteBinaryBlock (byte buff[], long buffsize, dword fileHandle)
;
当文件以二进制的方式打开时,可以以二进制的方式写入数据
- 1️⃣ 代码演示
On key 'z'
{byte buffer_bin[10];byte buffer_write[10]={'y','o','u','s','e','l','f'};long ret,retSize;int i,j=0;//写入setFilePath(".//TestModule//IniAutoCode", 2);//不可以直接设置C根目录,2表明可以对这个目录下的文件可读可写glbHandle = openFileWrite ("Data_out.txt",1); //1 ,表明是二进制方式打开文件写if ( glbHandle!=0 ){retSize = fileWriteBinaryBlock (buffer_write, elcount(buffer_write), glbHandle);writeLineEx(mNewPage,1,"retSize:%d",retSize); fileClose (glbHandle);}//读取验证glbHandle1 = OpenFileRead ("Data.txt",1); //1 ,表明是二进制方式打开文件,这里写入的路径必须是相对路径了,不可以是"C:\\Temp\\Data.txt",因为程序开始已经设置过操作的文件夹了if ( glbHandle1!=0 ){ do{retSize = fileGetBinaryBlock(buffer_bin,elcount(buffer_bin),glbHandle1);writeLineEx(mNewPage,1,"retSize:%d",retSize);for(i=0;i< retSize;i++)writeLineEx (mNewPage,1,"buffer_bin[%d]: %d.",i,buffer_bin[i]);}while(retSize > 0);fileClose (glbHandle1); } }on StopMeasurement
{writeDestroy(mNewPage);fileClose (glbHandle);
}
- 2️⃣ 写入文件的结果
程序中读取验证的输出
retSize:10
retSize:10
buffer_bin[0]: 121.
buffer_bin[1]: 111.
buffer_bin[2]: 117.
buffer_bin[3]: 115.
buffer_bin[4]: 101.
buffer_bin[5]: 108.
buffer_bin[6]: 102.
buffer_bin[7]: 0.
buffer_bin[8]: 0.
buffer_bin[9]: 0.
retSize:0
📙📙 字符串方式写入(filePutString)
long filePutString (char buff[], long buffsize, dword fileHandle)
;
向文件中写入字符串
- 1️⃣ 代码演示
On key 'x'
{char buffer_write[20]="yi xi wang yue";long ret;int i,j=0;setFilePath(".//TestModule//IniAutoCode", 2);//不可以直接设置C根目录,2表明可以对这个目录下的文件可读可写glbHandle = openFileWrite ("Data_out.txt",0); //以ASCII打开,并且覆盖文件原有内容if ( glbHandle!=0 ){ret = filePutString (buffer_write, strlen(buffer_write), glbHandle); if(ret){writeLineEx (mNewPage,1,"write ok.");fileClose (glbHandle);}else{writeLineEx (mNewPage,1,"write error.");} }
}
- 2️⃣ 结果
📙📙 覆盖写入(fileRewind )
long fileRewind (dword fileHandle);
回想写入的行数定位到第一行,然后写入会覆盖原有的内容
- 1️⃣ 代码演示
On key 'c'
{char buffer_write_1[20]="yi xi wang yue";char buffer_write_2[20]="yue wang xi yi";long ret;int i,j=0;setFilePath(".//TestModule//IniAutoCode", 2);//不可以直接设置C根目录,2表明可以对这个目录下的文件可读可写glbHandle = openFileWrite ("Data_out.txt",0); //以ASCII打开,并且覆盖文件原有内容if ( glbHandle!=0 ){ret = filePutString (buffer_write_1, strlen(buffer_write_1), glbHandle); fileRewind(glbHandle); ret = filePutString (buffer_write_2, strlen(buffer_write_2), glbHandle); if(ret){writeLineEx (mNewPage,1,"write ok.");fileClose (glbHandle);}else{writeLineEx (mNewPage,1,"write error.");} }
}
- 2️⃣ 结果
🌎总结
✂️ CSDN源码下载
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩 有微信的小伙伴可以关注下浪哥车载诊断,一个行业内小小圈子,群里有
网盘资料
,源码
,还有各路大神
闲时交流交流技术,聊聊工作机会啥的。
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
更多推荐
CAPL读写文本文件 txt,csv等
发布评论