CAPL读写文本文件 txt,csv等

编程入门 行业动态 更新时间:2024-10-09 16:28:28

CAPL读写<a href=https://www.elefans.com/category/jswz/34/1754584.html style=文本文件 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等

本文发布于:2024-03-05 22:13:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1713601.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:文本文件   CAPL   csv   txt

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!