c++ 处理文件 按列分割(分隔符切割文件) 自行实现算法未调用任何函数
本帖最后由 新建word 于 2019-1-25 16:14 编辑分隔符处理 ,近期 碰到很多文件 需要按照分隔符处理列
开发中 碰到两个问题为毛 把new 换成mallocdebug 调试中运行没问题换到生产环境中直接堆栈异常
#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);
fwrite("\n",1,1,files);
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 程序地址
argv 待处理数据地址
argv 分隔符数据
argv 分隔符数量
*/
int main(int argc, char ** argv)
{
if (argc < 4)
{
printf("参数:程序 待处理文本地址 \"分隔符(最好带英文双引号)\" 分隔符数量(列数减1) ");
return -1;
}
int col = atoi(argv);
if (!col)
{
MessageBoxA(NULL, "分隔符数量填写错误", "提示", MB_OK);
return -1;
}
char PATH;
FILE *file = NULL;
files = new FILE *;
if (fopen_s(&file, argv, "r"))
{
MessageBoxA(NULL,"打开文件失败","提示",MB_OK);
return-1;
}
for (int i = 0; i <=col; ++ i)
{
wsprintfA(PATH, "%d.txt", i);
if (fopen_s(&files, PATH, "a+"))
{
MessageBoxA(NULL, "打开写入文件失败", "提示", MB_OK);
return -2;
}
}
//////////////////上面的代码 乱乱的 获取控制台参数 下面是正文
char * buf = new char;
char *p_buf = buf;
char temp;
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, col);
}
p_buf = buf;
continue;
}
*p_buf = *temp;
p_buf++;
}
///////////内存清理
free(buf);
for (int i = 0; i <= col;++i)
{
fclose(files);
}
//free(files); //清理就出错 也是醉了
return 0;
}
c++中内存管理:非系统创建的 内存 记得要 清空置零操作。 否则 在使用指针的时候 会越界或者输出意想不到的数据
扣扣:B59F1937,
最后 因为不经常写 控制台程序 导致 写捕获参数的 代码乱乱的将就下吧!!!!!!
页:
[1]