|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 新建word 于 2019-1-25 16:14 编辑
- 分隔符处理 ,近期 碰到很多文件 需要按照分隔符处理列
- 开发中 碰到两个问题 为毛 把new 换成malloc debug 调试中运行没问题换到生产环境中直接堆栈异常
- #include "stdafx.h"
- #include <windows.h>
- FILE **files = NULL;
- int MAX_READ = 1024;
- void write_file(char *buf , int len ,int col)
- {
- fwrite(buf,1,len,files[col]);
- fwrite("\n",1,1,files[col]);
- return;
- }
- int str_str(char * buf , char *fgf ,int cols)
- {
- char * p = buf;
- char * index = buf;//数据索引
- char * f = fgf;
- int col = cols;
- while (*p++)//第一字符永远都不是分隔符
- {
- while (*p && *f && !(*p - *f))//经典
- p++, f++;
- if (!*f)
- {
- write_file(index, p - index - (f - fgf), col);//写入数据去掉分隔符
- f = fgf;
- col--;
- index = p;
- }
- if (!col)//写入最后一列
- {
- while (*p++);
- p--;
- write_file(index, p-index,col);
- }
- }
- return 1;
- }
- /*
- argv[0] 程序地址
- argv[1] 待处理数据地址
- argv[2] 分隔符数据
- argv[3] 分隔符数量
- */
- int main(int argc, char ** argv)
- {
- if (argc < 4)
- {
- printf("参数:程序 待处理文本地址 "分隔符(最好带英文双引号)" 分隔符数量(列数减1) ");
- return -1;
- }
- int col = atoi(argv[3]);
- if (!col)
- {
- MessageBoxA(NULL, "分隔符数量填写错误", "提示", MB_OK);
- return -1;
- }
- char PATH[MAX_PATH];
- FILE *file = NULL;
- files = new FILE *[col];
- if (fopen_s(&file, argv[1], "r"))
- {
- MessageBoxA(NULL,"打开文件失败","提示",MB_OK);
- return -1;
- }
- for (int i = 0; i <=col; ++ i)
- {
- wsprintfA(PATH, "%d.txt", i);
- if (fopen_s(&files[i], PATH, "a+"))
- {
- MessageBoxA(NULL, "打开写入文件失败", "提示", MB_OK);
- return -2;
- }
- }
- //////////////////上面的代码 乱乱的 获取控制台参数 下面是正文
- char * buf = new char[1025];
- char *p_buf = buf;
- char temp[1];
- ZeroMemory(buf, MAX_READ);
- while (!feof(file) && (p_buf - buf) < MAX_READ)//以防越界
- {
- *temp = fgetc(file);
- if (*temp =='\n' || *temp == '\r')
- {
- if ((p_buf - buf) > 1)//保证行 有数据
- {
- *p_buf = '\0';//最后一位置0操作;
- str_str(buf,argv[2], col);
- }
- p_buf = buf;
- continue;
- }
- *p_buf = *temp;
- p_buf++;
- }
- ///////////内存清理
- free(buf);
- for (int i = 0; i <= col;++i)
- {
- fclose(files[i]);
- }
- //free(files); //清理就出错 也是醉了
- return 0;
- }
- c++中内存管理:非系统创建的 内存 记得要 清空置零操作。 否则 在使用指针的时候 会越界或者输出意想不到的数据
复制代码
扣扣:B59F1937,
|
|