c语言如何排列文件内容,C语言实现文件内容按行随机排列的算法示例

本文实例讲述了C语言实现文件内容按行随机排列的算法。分享给大家供大家参考,具体如下:

在实际工作上有种需求, 就是需要从给定的数据里,随机抽取一部分。

有一种简单的方法是根据总的数据条数和要抽取的数据条数, 通过简单方法,隔几行取一个,这样也能达到随机抽取一部分的目的。

但这样,源数据是顺序的,则抽取的数据也是顺序的,不满足一些情境。

这里实现的功能是: 将全部数据,按行重新随机排列, 这样从结果头部选几行,就是随机抽取的几行了,比较方便。

实现的思路:  对于N行的数据, 给每一行用[1-N]之间不重复的数做标记, 最后按标记数排列即可。(不重复上要稍微费点儿心思)

实现思路比较重要,实现就简单了~

实现上用c结合shell的方式,下面为参考代码。

总控脚本:用不重复随机数做标记,然后按标记排序

#!/bin/sh

### note: sh random.sh in_fname out_fname ###

infile=$1

outfile=$2

line_num=`cat $infile | wc -l `

./random $line_num $infile $outfile.tmp

sort $outfile.tmp -k 2 -n -t ' ' | cut -f1 > $outfile

随机化的执行程序random的实现

//random.c

#include

#include

#include

#include

using namespace std;

const int LEN = 4098;

//返回属于[p,q)的随机整数

int rand(int p, int q)

{

int size = q-p+1;

return p+ rand()%size;

}

//交换两个元素值

void swap(int& a , int& b)

{

int temp = a;

a = b;

b = temp;

}

//打印数组值

void print(int *v, int n)

{

for(int i=0; i < n ; i++)

{

printf("%u\n", v[i]);

}

}

//给数组a[n], 随机不重复赋值[1,n]之间的数

void randomize(int *v, int n)

{

//initialize

for(int i=0; i < n; i++)

{

v[i] = i+1;

}

for(int i=n-1; i>0; i--)

{

int r = rand(0,i+1);

swap(v[r], v[i]);

}

}

//删除换行符

int chomp(char *str)

{

int len = strlen(str);

while(len > 0 && (str[len - 1] == '\n' || str[len - 1] == '\r'))

{

str[len - 1] = 0;

len--;

}

return len;

}

//主函数

int main(int argc, char *argv[])

{

int line_num = atoi(argv[1]);

printf("%u\n",line_num);

int *value = (int*)malloc((line_num) * sizeof(int));

printf("%u\n",line_num);

randomize(value, line_num);

//print(value, N);

FILE* infile = fopen(argv[2], "r");

if( infile == NULL )

{

printf("Cann't open file %s.", argv[1]);

return 0;

}

FILE* outfile = fopen(argv[3], "w");

if( outfile == NULL)

{

printf("Cann't open file %s to write.", argv[2]);

return 0;

}

int i=0;

char str[LEN];

str[0] = 0;

str[LEN-1] = 0;

while( !feof(infile) )

{

if( !fgets(str, sizeof(str),infile))

{

break;

}

str[LEN- 1] = 0;

chomp(str);

fprintf(outfile, "%s\t%u\n", str, value[i]);

i++;

}

fclose(infile);

fclose(outfile);

return 0;

}

希望本文所述对大家C语言程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值