【问题标题】:Create & Append Files into Directory创建文件并将其附加到目录中
【发布时间】:2015-10-28 01:40:52
【问题描述】:

我有点像这个人(coava)发布的类似问题。

(Append Random Text without Repetition for File (C))

总结:基本上我正在尝试创建文件,将随机单词附加到其中并将文件存储到目录中

我已经尝试了给出的解决方案,但它对我不起作用,可能是因为在我的情况下,我也将这些文件存储在目录中。

所以我的代码(编辑:这是我的一段代码)看起来像这样:

char *room[4];
room[0] = "okay";
room[1] = "sure";
room[2] = "fine";
room[3] = "noo";

int pid = getpid();
char dirname[30]
sprintf(dirname,"rooms.%d",(int)getpid());
mkdir(dirname,0777);

int bufSize=128;
char *current = malloc(bufSize);
int nroom = sizeof(room) - 1;
int count;

for (count=0;count<3;count++) {
 int ipick = rand()%nroom;
 int *pick = room[ipick];
 room[nroom] = room [--nroom];
 snprintf(currentFile,bufSize,"file-%d.txt",count);
 FILE *f = fopen(currentFile,"w")
 fprintf(f, "YOUR ROOM: %s\n",pick);
 fclose(f);
}

然后我得到一个seg.fault,我尝试修改

snprintf(currentFile,bufSize,"file-%d.txt",count);

进入

snprintf(currentFile,bufSize,"file-%d.txt",dirname,count);

它没有给出 seg.fault,但它只是在目录外打印,并在每个文件的内部添加有时我会得到随机值,例如

“连接主机:@blablabla”或一些垃圾符号。

我的 for 循环有问题吗?还是在别的地方?

【问题讨论】:

  • 所以我的代码看起来很像这样是没有意义的。如果您需要帮助找出它为什么不起作用,请发布您的实际代码。发布like it 意味着您可以在编写代码时引入新错误(或忽略真实错误)。将实际代码相关部分复制/粘贴到问题中。
  • @KenWhite 那是我的真实代码....
  • 'int nroom = sizeof(room) - 1;' - 看起来不太好:(
  • 您可能需要:snprintf(currentFile, bufSize, "%s/file-%d.txt", dirname, count); — 您忘记输入转换规范来处理目录名称。您还需要添加所有编译器警告(gcc -Wall 至少;gcc -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes 与我使用的接近(我也使用其他一些更深奥的标志)。
  • 它是四个指针的大小,以字节为单位,减去 1。所以,在普通系统上,它将是 15 或 31。

标签: c random directory


【解决方案1】:

此代码有效:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

int main(void)
{
    char *room[4] = { "okay", "sure", "fine", "noo" };
    int pid = getpid();
    char dirname[30];
    sprintf(dirname, "rooms.%d", pid);
    if (mkdir(dirname, 0777) != 0)
    {
        fprintf(stderr, "Oops: did not create directory %s\n", dirname);
        exit(1);
    }

    int bufSize = 128;
    char *current = malloc(bufSize);
    int nroom = 4; // sizeof(room) - 1;

    for (int count = 0; count < 3; count++)
    {
        int ipick = rand() % nroom;
        char *pick = room[ipick];
        room[ipick] = room[--nroom];
        snprintf(current, bufSize, "%s/file-%d.txt", dirname, count);
        FILE *f = fopen(current, "w");
        if (f != 0)
        {
            fprintf(f, "YOUR ROOM: %s\n", pick);
            fclose(f);
        }
    }

    return 0;
}

有很多小的更正。更大的一个是在使用单词列表时打乱它们的代码。另一个是为nroom 设置的值。我将生活简化为常数 4;您可以改用sizeof(room) / sizeof(room[0]),它会随着数组的增长而增长。我使用了数组初始值设定项而不是赋值 - 并且可以从数组大小中省略 4(它会根据初始值设定项中的值数量自动调整大小)。

每次运行时都会产生相同的结果(具有相同内容的相同文件集)。将#include &lt;time.h&gt; 添加到标头并在循环之前添加srand(time(0)); 以在不同的运行中获得不同的结果。这是播种随机数生成器的一种非常简单的方法。 getpid() 代替 time(0) 也有一些优点。

【讨论】:

  • 您关于添加%s/ 的建议直接在我的代码中起作用,但是由于您已经编写了整个代码,所以我要感谢您的帮助。另外,我认为是直接声明常量,因为当我尝试这样做时,不再有 seg。出现故障。
  • 嗨乔纳森,很抱歉再次问你一个问题。但是,它似乎可以工作,但为什么在我运行它几次后,有时仍然有 2 或 3 个文件具有相同的附加名称? room2.txt and room3.txt contain "okay"
  • 我已经在循环之前用srand(pid); 更新了我的程序副本(不是答案中的副本),它会打印出目录名称。超过 100 次运行,我没有得到任何重复。您是否在我所做的循环中进行了所有更改?您的原始代码不正确。
  • 啊,我的错,我仍然保留 room[nroom] = room[--nroom]; 而不是 room[ipick] = room[--nroom];。感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多