首页 > 解决方案 > (C) 使用 /dev/urandom 生成随机数据并将其写入文件

问题描述

我对 C 很陌生,我不确定我写的这段代码有什么问题。它应该使用指定的名称打开(或在需要时创建)一个文件,并在该文件中写入一堆取自 /dev/urandom 文件的标志。我需要精确数量的元素,每个元素都具有指定的长度。我需要能够稍后编辑该创建的文件,但我想首先专注于创建这个生成器部分。编译或尝试执行它时它没有显示任何错误,但仍然没有任何反应 - 该文件仍然不存在于任何地方。它出什么问题了?

int main(){

     void generate(char str[], int a, int b);

}


void generate(char str[], int a, int b){
    int n=0;
    char fname[128];
    strcpy(fname,str);
    strcpy(fname, ".txt");
    FILE *myFile = fopen(fname, "w");
    FILE *randomiser = fopen("/dev/urandom", "r");
   
    char bufor[a];
    size_t result = fread (bufor, b, a, randomiser);
    size_t end = fwrite (bufor, b, a, myFile);
   
    fclose(myFile);
    fclose(randomiser);
}

@edit 按照某人的建议更改磁贴并稍微更改了代码,因为我仍在尝试解决它我忘了提到这个函数的全部意义在于它可以在终端中调用,例如 ./program generate data 100 100。

标签: cfilerandom

解决方案


这是您要求的确切解决方案

你去吧。我使用 open 而不是 fopen,从 /dev/urandom 中读取一定数量的字符,然后将其写入 fd2(创建的文件),

注意缓冲区的大小,注意 NULL (\0) 终止字符串

#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>

int generate(char **av)
{
    int fd1 = open("/dev/urandom", O_RDONLY);
    int fd2 = open(av[1], O_CREAT | O_RDWR, S_IRWXU);
    int size = atoi(av[2]);
    int row = atoi(av[3]);
    int i = -1;
    int j = -1;

    if (fd1 == -1 || fd2 == -1 || size <= 0 || row <= 0 )
        return (1);
    char buf[size];
    while (++i < row-1)
    {
        read(fd1, buf, size);
        buf[size -1] = '\0';
        write(fd2, buf, size -1);
        while (++j < size)
            buf[j] = '\0';
    }
    close(fd1);
    close(fd2);
    return (0);
}

int main(int ac, char **av)
{
    int s;

    if (ac < 4)
        return (1);
    generate(av);
    return (0);
}

将 10 * 100 字符放入文件 'blabla' 使用:

$~> gcc prog.c -o 程序

$~> ./program blabla 100 10

将创建/打开文件“blabla”,从 /dev/uramdom 读取 100 并写入 blabla

要解释你在这里做错了什么,请看:

这是一个函数的声明

void generate(int i, char *a);

这是对函数的调用

generate(25, "Blablabla");

有时当你声明一个函数时,你也会实例化它

int generate(int i, char *a)
{
    Operation;
    operation;
    return (0);
}

声明和实例化是不同的,假设我在上面的代码示例中在函数 main 下编写了函数生成,函数 main 不会知道什么是“生成”但是如果你在 main 之前声明它就像这样它可以工作

void generate(int i, char *a);

推荐阅读