鱼C论坛

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

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

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

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

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

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,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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