CAPL读写文本文件 txt,csv等

📙 相关文章

在这里插入图片描述


📘前言

  • 🍅本节内容,我们来逐个解读下CAPL内置的文本操作函数
  • 🍅演示软硬件环境 Win10 x64 ; CANoe 11 SP2 x64

请添加图片描述

请添加图片描述

📗 读取文件(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️⃣ 结果
    在这里插入图片描述

请添加图片描述
23

🌎总结

请添加图片描述

✂️ CSDN源码下载

7

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩 有微信的小伙伴可以关注下浪哥车载诊断,一个行业内小小圈子,群里有网盘资料源码还有各路大神 闲时交流交流技术,聊聊工作机会啥的。

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18
  • 19
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚂蚁小兵

慢慢长夜磨一章好文章,费烟!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值