鱼C论坛

 找回密码
 立即注册
查看: 1484|回复: 1

[技术交流] c++ 处理文件 按列分割(分隔符切割文件) 自行实现算法未调用任何函数

[复制链接]
发表于 2019-1-25 16:00:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 新建word 于 2019-1-25 16:14 编辑
  1. 分隔符处理 ,近期 碰到很多文件 需要按照分隔符处理列

  2. 开发中 碰到两个问题  为毛 把new 换成malloc  debug 调试中运行没问题换到生产环境中直接堆栈异常

  3. #include "stdafx.h"
  4. #include <windows.h>
  5. FILE **files = NULL;
  6. int MAX_READ = 1024;
  7. void write_file(char *buf , int len ,int col)
  8. {
  9.     fwrite(buf,1,len,files[col]);
  10.     fwrite("\n",1,1,files[col]);
  11.     return;
  12. }
  13. int str_str(char * buf , char *fgf ,int cols)
  14. {
  15.     char * p = buf;
  16.     char * index = buf;//数据索引
  17.     char * f = fgf;
  18.     int col = cols;
  19.     while (*p++)//第一字符永远都不是分隔符
  20.     {
  21.         while (*p && *f && !(*p - *f))//经典
  22.             p++, f++;
  23.         if (!*f)
  24.         {
  25.             write_file(index, p - index - (f - fgf), col);//写入数据去掉分隔符
  26.             f = fgf;
  27.             col--;
  28.             index = p;
  29.         }
  30.         if (!col)//写入最后一列
  31.         {
  32.             while (*p++);
  33.             p--;
  34.             write_file(index, p-index,col);
  35.         }
  36.     }
  37.     return 1;
  38. }
  39. /*
  40. argv[0] 程序地址
  41. argv[1] 待处理数据地址
  42. argv[2] 分隔符数据
  43. argv[3] 分隔符数量
  44. */
  45. int main(int argc, char ** argv)
  46. {
  47.     if (argc < 4)
  48.     {
  49.         printf("参数:程序 待处理文本地址 "分隔符(最好带英文双引号)" 分隔符数量(列数减1) ");
  50.         return -1;
  51.     }
  52.     int col = atoi(argv[3]);
  53.     if (!col)
  54.     {
  55.         MessageBoxA(NULL, "分隔符数量填写错误", "提示", MB_OK);
  56.         return -1;
  57.     }
  58.     char PATH[MAX_PATH];
  59.     FILE *file = NULL;
  60.     files = new FILE *[col];
  61.     if (fopen_s(&file, argv[1], "r"))
  62.     {
  63.         MessageBoxA(NULL,"打开文件失败","提示",MB_OK);
  64.         return  -1;
  65.     }
  66.     for (int i = 0; i <=col; ++ i)
  67.     {
  68.         wsprintfA(PATH, "%d.txt", i);
  69.         if (fopen_s(&files[i], PATH, "a+"))
  70.         {
  71.             MessageBoxA(NULL, "打开写入文件失败", "提示", MB_OK);
  72.             return -2;
  73.         }
  74.     }

  75. //////////////////上面的代码 乱乱的 获取控制台参数 下面是正文
  76.     char * buf = new char[1025];
  77.     char *p_buf = buf;
  78.     char temp[1];
  79.     ZeroMemory(buf, MAX_READ);
  80.     while (!feof(file) && (p_buf - buf) < MAX_READ)//以防越界
  81.     {
  82.         *temp = fgetc(file);
  83.         if (*temp =='\n' || *temp == '\r')
  84.         {
  85.             if ((p_buf - buf) > 1)//保证行 有数据
  86.             {
  87.                 *p_buf = '\0';//最后一位置0操作;
  88.                 str_str(buf,argv[2], col);
  89.             }
  90.             p_buf = buf;
  91.             continue;
  92.         }
  93.         *p_buf = *temp;
  94.         p_buf++;
  95.     }
  96.     ///////////内存清理
  97.     free(buf);
  98.     for (int i = 0; i <= col;++i)
  99.     {
  100.         fclose(files[i]);
  101.     }
  102.     //free(files); //清理就出错 也是醉了
  103.     return 0;
  104. }

  105. c++中内存管理:非系统创建的 内存 记得要 清空置零操作。 否则 在使用指针的时候 会越界或者输出意想不到的数据
复制代码


扣扣:B59F1937,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-25 16:01:50 | 显示全部楼层
最后 因为不经常写 控制台程序 导致 写捕获参数的 代码乱乱的  将就下吧!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-25 03:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表