IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 2021-07-31 记如何用C语言把txt数据文件切成四份,再归并 -> 正文阅读

[C++知识库]2021-07-31 记如何用C语言把txt数据文件切成四份,再归并

项目场景:

有一个名为rand_num.txt的txt数据文件,里面存了1000个随机的数,如下图:
在这里插入图片描述
需要用c语言读取,并写入四个新的txt文件。最后再排序归并到一个txt文件。本文只记录分割数据与归并数据的方法


问题描述:

这并不是我直接遇到的问题。事实上是有一位小姐姐在做老师给的一个大作业时使用了fscanf()和fprintf()函数组合做数据切割,用fread()和fwrite()函数做数据归并。

很不幸,方法都是对的,可是第一次写的时候都出现了数据乱码的错误。拿给我看的时候,我也被乱码的错误搞的一脸懵。我一开始就怀疑是代码错误引起的。然而事实上,人的大致思路是很少出错的,c语言标准库函数对编码格式对容忍度实际上也是很高的。

最后查出来,竟然都是一些细枝末节的语法,代码规范导致的一些无法被编译器即时捕捉的错误导致的。所以一个好的代码规范相当重要,既能让自己高效,也能少浪费他人的时间。

对于C语言这种面向过程的语言,我建议尽量把各个功能都分别交给独立的子函数完成。子函数的命名一定要是有实际意义的英文单词,接口参数也尽量如此命名。再就是主函数调用时一定把变量作为参数传递给子函数,千万不要直接带入变量的实际值,能减少很多类型引起的错误,方便重用代码和调试。


原因分析:

在使用fscanf()和fprintf()时,一定要注意这两个都是格式化的读写,fscanf()的参数要传入地址变量,尽量不要在循环读写的时候增加很多不必要的变量值和参数,也建议直接读写,减少中间变量数组的使用。

解决方案:

本着提高代码可重用的目的,提供本人写好后复制粘贴可用的子函数实现。

divide子函数有五个参数,实现了把一个拥有1000个整数的txt文件均分成四个拥有250个整数的txt文件。

int divide(const char *out1, const char *out2, const char *out3, const char *out4, const char *in)
	// out1-out4 are your output txt and in is your original txt
{
    FILE *f_in, *f_out;
    int num, i;
    num = 1000; 
	// set the number of the digits in your original txt.
    int buf[num];
    
    int n;
    
    f_in = fopen(in, "r");
    for(i=0; i<1000;i++)
        fscanf(f_in, "%d", &buf[i]);
    fclose(f_in);
	// open and close txt every time you use it

    f_out = fopen(out1, "w");
    for(i=0; i<250; i++)
        fprintf(f_out, "%d ", buf[i]);
    fclose(f_out);
	// if you want to output digits with space, you should use "%d " instead of "%d"    
    f_out = fopen(out2, "w");
    for(i=250; i<500; i++)
        fprintf(f_out, "%d ", buf[i]);
    fclose(f_out);
    
    f_out = fopen(out3, "w");
    for(i=500; i<750; i++)
        fprintf(f_out, "%d ", buf[i]);
    fclose(f_out);
    
    f_out = fopen(out4, "w");
    for(i=750; i<1000; i++)
        fprintf(f_out, "%d ", buf[i]);
    fclose(f_out);
    
    return 1;
	// return 1 can help you know if you read and write successfully in your main function
}

merge子函数也有五个参数,实现了把四个拥有250个整数的txt文件归并成一个txt文件的功能。

int merge(const char *in1, const char *in2, const char *in3, const char *in4, const char *out)
{
    FILE *f_in, *f_out;
    int buf[1000];
    int n;
    
    f_out = fopen(out, "a");
    if(!f_out)
        return 0;
    
    f_in = fopen(in1, "r");
    if(!f_in)
        return 0;
    
    while((n=fread(buf,1,sizeof(buf),f_in)))    
    // read by single byte
    {
        fwrite(buf,1,n,f_out);  
        // write by single byte
    }
    char space[] = {' '};
    fwrite(space,1,1,f_out);    
    // add a space at the end
    fclose(f_in);
    fclose(f_out);  
    // close f_out first
    
    f_out = fopen(out, "a");
    if(!f_out)
        return 0;
    
    f_in = fopen(in2, "r");
    if(!f_in)
        return 0;
    
    while((n=fread(buf,1,sizeof(buf),f_in)))    
    // read by single byte
    {
        fwrite(buf,1,n,f_out); 
        // write by single byte
    }
    fwrite(space,1,1,f_out);    
    // add a space at the end
    fclose(f_in);
    fclose(f_out);  
    // close f_out first
    
    f_out = fopen(out, "a");
    if(!f_out)
        return 0;
    
    f_in = fopen(in3, "r");
    if(!f_in)
        return 0;
    
    while((n=fread(buf,1,sizeof(buf),f_in)))    // read by single byte
    {
        fwrite(buf,1,n,f_out);  
        // write by single byte
    }
    fwrite(space,1,1,f_out);   
     // add a space at the end
    fclose(f_in);
    fclose(f_out); 
     // close f_out first
     
    f_out = fopen(out, "a");  
     // open file again with "a"
    if(!f_out)
        return 0;
    
    f_in = fopen(in4, "r");
    if(!f_in)
        return 0;
    
    while((n=fread(buf,1,sizeof(buf),f_in)))
    {
        fwrite(buf,1,n,f_out);
    }
    fclose(f_in);
    fclose(f_out);
    return 1;
    // return 1 can help you know if you read and write successfully in your main function
}


  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:19:22  更:2021-08-01 14:19:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 15:50:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码