我是靠谱客的博主 高兴可乐,最近开发中收集的这篇文章主要介绍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
}


最后

以上就是高兴可乐为你收集整理的2021-07-31 记如何用C语言把txt数据文件切成四份,再归并项目场景:问题描述:原因分析:解决方案:的全部内容,希望文章能够帮你解决2021-07-31 记如何用C语言把txt数据文件切成四份,再归并项目场景:问题描述:原因分析:解决方案:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部