c - (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。
解决方案
这是您要求的确切解决方案
你去吧。我使用 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);
推荐阅读
- azure-devops - 从 Application Insights 在 Azure DevOps 中“创建工作项”需要哪些角色
- javascript - Vue.js:在下拉菜单中管理多个按钮
- python - Django本地内存缓存在heroku上不起作用
- php - Slim 4 - 未捕获的类型错误:传递给 {closure}() 的参数 1 必须是 RouterCollectorProxy 的实例
- r - ggplot2 刻面标签 - 不显示第二行
- php - 如果选中 ACF 子字段,则隐藏行
- shell - 如果 ZDOTDIR 设置为自定义文件夹,则 PyCharm zsh shell 没有完整的用户 PATH 变量
- hana - 在 HANA 上同时更新 2 个连接表?
- java - Java Spring如何使用名称进行映射
- javascript - React Hooks:处理多个输入