| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6738 人关注过本帖
标题:关于C语言分割、修改、保存文件的
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用zhu224039在2014-7-16 10:57:03的发言:

  又学一招 strstr


平时多翻查一下《库函数参考手册》即可。

授人以渔,不授人以鱼。
2014-07-16 11:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
楼主搞定没有?明后天我都没空上来的啦。

授人以渔,不授人以鱼。
2014-07-16 21:00
烛林小煜
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2014-7-13
收藏
得分:0 
回复 42 楼 TonyDeng
我看了 由于是C++的程序 鄙人没有学过C++只是略微学了点C   我做了做注释 不知道对不对  你有时间看看行不   
#include <Windows.h>
#include <cstdio>     //相当于C里面的stdio.h
#include <cstdlib>    //相当于stdlib.h
#include <conio.h>    //控制台输入输出 需要从网上下载

bool OpenSourceFile(FILE** file, const char* path, const char* name);    /*打开原文件*/
bool CreateTargetFile(FILE** file, const char* path, size_t count);    /*创建目标文件*/
 HLOCAL GetErrorMessage(DWORD error_code);                /*指向内存首地址,得到错误报告(双字节)*/
void Pause(void);

int main(int argc, char* argv[])    /*argc: 整数,用来统计你运行程序时送给main函数的命令行参数的个数;* argv[ ]: 字符串数组,用来存放指向你的字符串参数的指针数组,                    每一个元素指向一个参数*/
 {
     if (argc < 2)
     {
         printf_s("程序使用格式: %s \"数据文件所在路径\"\n", strrchr(argv[0], '\\') + 1);    /*argv[0] 指向程序运行的全路径名,strrchr是从argv[0]中从右起查询到第一                                                    个'\\',返回值为‘\\’到结尾,即文件路径*/
         Pause();
         return EXIT_SUCCESS;            /*已定义的常量EXIT_SUCCESS*/
     }

     //const char* dataPath = "..\\open circuit\\";
    const char* dataPath = argv[1];                /*argv[1] 指向在DOS命令行中执行程序名后的第一个字符串,路径*/
     const char* flagString = "  TIME        V";        /*标志字符串为TIME      V*/

     printf_s("处理路径: %s\n", dataPath);
     FILE* inputFile;                        /*文件指针*/
     if (!OpenSourceFile(&inputFile, dataPath, "data.out"))
     {
         Pause();
         exit(EXIT_FAILURE);
     }
     char buffer[1024];
     size_t count = 0;                        /*size_t相当于无符号长整形*/
     while (fgets(buffer, sizeof(buffer) - 1, inputFile) != NULL)        /*char *fgets(char *buf, int bufsize, FILE *stream);参数buf指向用来存储的地址,bufsize                                        存储的数据长度,stream读取的文件流*/
     {
         if (strstr(buffer, flagString) != NULL)                /*  strstr(str1,str2)返回st2在st1中的位置,若没有在st1中找到则返回null*/
         {
             ++count;
             FILE* outputFile;
             if (!CreateTargetFile(&outputFile, dataPath, count))        /*没创建则跳出*/
             {
                 Pause();
                 exit(EXIT_FAILURE);
                 break;
             }
             printf_s("正在生成输出文件: %d.txt\n", count);            /*count.txt*/
             bool escape = false;
             while ((fgets(buffer, sizeof(buffer) - 1, inputFile) != NULL) && !escape)        /*buffer指针位置存储inputfile非空无错*/
             {
                 if (strlen(buffer) > 0)                    /*buffer长度大于0*/
                 {
                     if (buffer[0] == 0x0c)                    /*Form Feed (馈页),什么意思?  */
                     {
                         escape = true;
                         break;
                     }
                     fprintf_s(outputFile, "%s", buffer);
                 }
             }
             fclose(outputFile);
         }
     }
     fclose(inputFile);

     Pause();
     return EXIT_SUCCESS;
 }

bool OpenSourceFile(FILE** file, const char* path, const char* name)
 {
     char fullFilePath[MAX_PATH];
     bool success = true;

     strcpy_s(fullFilePath, MAX_PATH - 1, path);        /*把path中长度为MAX_path-1的内容复制给fullFilePath,path存储的是路径*/
     strcat_s(fullFilePath, MAX_PATH - 1, name);        /*name是data.out,字符串链接,把name连接path后面*/
     if (fopen_s(file, fullFilePath, "rt") != 0)        /*打开的文件指针file,文件名fullFilenPath,访问类型rt(以文本文件读)*/
     {
         HLOCAL errorMessage = GetErrorMessage(GetLastError());
         printf_s("文件\"%s\"打开失败: %s\n", fullFilePath, errorMessage);
         LocalFree(errorMessage);                /*释放锁定的内存*/
         success = false;
     }

     return success;
 }

bool CreateTargetFile(FILE** file, const char* path, size_t count)      /*创建*.txt文件*/
 {
     char fullFilePath[MAX_PATH];
     char numberString[4];
     bool success = true;

     strcpy_s(fullFilePath, MAX_PATH - 1, path);        /*把path中长度为MAX_path-1的内容复制给fullFilePath,path存储的是路径*/
     _itoa_s(count, numberString, sizeof(numberString), 10);    /*errno_t _itoa_s(int value,char *buffer,size_t sizeInCharacters,int radix);radix为10进制buffer的进制,                                    sizeInCharacters为buffer字符数组的长度,value为待转换整数。整体功能是把一个整数转换成字符串*/

     strcat_s(fullFilePath, MAX_PATH - 1, numberString);
     strcat_s(fullFilePath, MAX_PATH - 1, ".txt");
     if (fopen_s(file, fullFilePath, "wt") != 0)
     {
         HLOCAL errorMessage = GetErrorMessage(GetLastError());
         printf_s("文件\"%s\"创建失败: %s\n", fullFilePath, errorMessage);
         LocalFree(errorMessage);
         success = false;
     }

     return success;
 }

 HLOCAL GetErrorMessage(DWORD errorCode)
 {
     HLOCAL messageText = NULL;
     FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageText, 0,    NULL);
     return messageText;
 }

void Pause(void)
 {
     printf_s("\nPress any key to continue...");
     _getch();
 }
2014-07-17 16:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你这只是查到了所使用的函数功能,但程序本身的工作原理还是没看懂。有空我补上注解给你。

授人以渔,不授人以鱼。
2014-07-18 09:26
烛林小煜
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2014-7-13
收藏
得分:0 
回复 41 楼 TonyDeng
大神,由于我需要用matlab调用这段程序,我matlab里有一个打开.out文件的按钮,我想通过这个按钮来实现对选择的out文件分割成txt
但是你给我的这段程序里需要用命令行,而且好像还得在IDE里设置.out文件的路径吧,能不能改下
2014-07-18 09:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用烛林小煜在2014-7-18 09:28:47的发言:

大神,由于我需要用matlab调用这段程序,我matlab里有一个打开.out文件的按钮,我想通过这个按钮来实现对选择的out文件分割成txt
但是你给我的这段程序里需要用命令行,而且好像还得在IDE里设置.out文件的路径吧,能不能改下


我这程序就是用命令行的啊,在命令行中把.out文件的路径作为参数传进去。不需要在IDE中设置,在IDE中设置的画面是我怕你不知道在IDE中怎么设置命令行参数而给你的。程序编译好之后,不需要IDE。

授人以渔,不授人以鱼。
2014-07-18 09:32
NBABOY
Rank: 4
等 级:业余侠客
威 望:4
帖 子:129
专家分:281
注 册:2013-5-2
收藏
得分:0 
2014-07-18 14:01
NBABOY
Rank: 4
等 级:业余侠客
威 望:4
帖 子:129
专家分:281
注 册:2013-5-2
收藏
得分:0 
噢哦!
2014-07-18 14:03
NBABOY
Rank: 4
等 级:业余侠客
威 望:4
帖 子:129
专家分:281
注 册:2013-5-2
收藏
得分:0 
噢哦!
2014-07-18 14:26
烛林小煜
Rank: 1
等 级:新手上路
帖 子:63
专家分:0
注 册:2014-7-13
收藏
得分:0 
回复 46 楼 TonyDeng
不是   我的意思是  我要调用的那个  需要用到void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])这么一个函数 才能在matlab中用    另外是这样的     我传了一个附件,就是附件上的那样   我想通过那个按钮然后打开选择文件的对话框,选择完文件后(一个.out文件),接下来执行的程序就是那个C/C++程序,C程序不需要输入任何参数 ,做到的功能就是以前说的那样,把选择的那个.out文件按照以前说的那种方式分割出来。最好是这段程序中不需要输入任何参数
。另外由于是在MATLAB中调用 ,所以需要一个void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])函数 ,这个函数好像是需要写到C程序里面。另外C这段程序执行结果是生成了*.txt(1-10)的文件,不需要在界面上显示出来  生成就行了   你看看有时间能不能给改一下  我C这方面学得不好 没怎么看懂 。
2014-07-18 15:39
快速回复:关于C语言分割、修改、保存文件的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.052112 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved