尝试附加到文件C时权限被拒绝

尝试附加到文件C时权限被拒绝,c,file,C,File,我正在尝试使用C打开文件并附加到它们。我正在根据进程Id动态命名目录,并根据循环中随机选择的“文件室”创建文件名。我的意图是打开文件,将文件室名称附加到文件中,然后关闭文件并移动到下一个文件室并执行相同的功能。我遇到的问题是“开放”。它似乎只返回-1,这表示有错误。错误消息说明“权限被拒绝”。我对此感到困惑,因为我似乎正在打开函数中设置正确的权限。我尝试使用fopen(),但这始终会产生分段错误11。我的roomFilePath声明和用法是否存在问题,或者我对open的用法是否不正确?下面是代码

我正在尝试使用C打开文件并附加到它们。我正在根据进程Id动态命名目录,并根据循环中随机选择的“文件室”创建文件名。我的意图是打开文件,将文件室名称附加到文件中,然后关闭文件并移动到下一个文件室并执行相同的功能。我遇到的问题是“开放”。它似乎只返回-1,这表示有错误。错误消息说明“权限被拒绝”。我对此感到困惑,因为我似乎正在打开函数中设置正确的权限。我尝试使用fopen(),但这始终会产生分段错误11。我的roomFilePath声明和用法是否存在问题,或者我对open的用法是否不正确?下面是代码中包含问题的部分。makeRooms()函数用于检查文件是否正确打开。谢谢

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>

#define NUM_ROOMS 10
#define NUM_USED_ROOMS 7
#define MAX_CONNECTIONS 6

time_t t;
char* usedRooms[NUM_USED_ROOMS];
int i;
char directoryName[100];
char* baseDirectory = "walterer.rooms.";
int processId;
char roomFilePath[75];
int adjacencyMatrix[7][7] = {0};
int useableConnections;
int e;
int totConnections = 0;
int openRoom;
int file_descriptor;

char* roomNames[] = {

    "cleveland",
    "columbus",
    "dallas",
    "toledo",
    "miami",
    "sarasota",
    "boston",
    "chicago",
    "denver",
    "phoenix"


};

int connections[10] = {
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0
};


void makeDirectory() {

    processId = getpid();
    sprintf(directoryName, "%s%d", baseDirectory,processId);
    //printf("%s\n", directoryName);
    mkdir(directoryName, 777);

}

void makeRooms() {

    /* Initializes random number generator */
    srand((unsigned) time(&t));

    /* Create 7 rooms */
    for(i = 0; i < NUM_USED_ROOMS; ){

        /* Generate random number between 0 to 10 */
        int randomNumber = rand() % NUM_ROOMS;

        /* Loop as long the array does not contain any connections at the index */
        while(connections[randomNumber] == 0) {

            /* Append the room path to the end of my ONID path */
            sprintf(roomFilePath,"%s/%s", directoryName, roomNames[randomNumber]);
            printf("%s\n",roomFilePath);

            /* Create file */
            FILE *filePointer;

            /* Open file to append*/
            //filePointer = open(roomFilePath, O_WRONLY | O_CREAT, 0600);


            //!!!Returning -1
            file_descriptor = open(roomFilePath, O_APPEND, 0600);
            printf("%d\n",file_descriptor);
            if (file_descriptor == -1)
            {
                printf("open() failed on \"%s\"\n", roomFilePath);
                perror("In createRooms()");
                exit(1);
            }


            /*if (filePointer == NULL)      
            {
                fprintf(stderr, "Error Creating File\n");
                printf("something went wrong with read()! %s\n", strerror(errno));
            }*/
            /* Print the room name in the file */
            /* SEG FAULT HERE!!!! */
            fprintf(filePointer, "ROOM NAME: %s\n", roomNames[randomNumber]);

            /* Close the file */
            //fclose(filePointer);
            usedRooms[i] = roomNames[randomNumber];
            connections[randomNumber] = 1;

            //printf("Room %d is %s \n", i+1, roomNames[randomNumber]);
            i++;
        }

    }

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义房间数量10
#定义房间的使用数量7
#定义最大连接数6
时间;
char*usedRooms[NUM_USED_ROOMS];
int i;
char directoryName[100];
char*baseDirectory=“walterer.rooms。”;
int进程ID;
char roomFilePath[75];
int邻接矩阵[7][7]={0};
内部可用连接;
INTE;
int=0;
开放式室内;
int文件描述符;
char*roomNames[]={
“克利夫兰”,
“哥伦布”,
“达拉斯”,
“托莱多”,
“迈阿密”,
“萨拉索塔”,
“波士顿”,
“芝加哥”,
“丹佛”,
“凤凰”
};
int连接[10]={
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
};
void makeDirectory(){
processId=getpid();
sprintf(directoryName,“%s%d”,baseDirectory,processId);
//printf(“%s\n”,目录名);
mkdir(directoryName,777);
}
void makeRooms(){
/*初始化随机数生成器*/
srand((未签名)时间(&t));
/*创建7个房间*/
对于(i=0;i
首先,这一行中缺少了
open()
所需的
标志
参数的一部分:

        file_descriptor = open(roomFilePath, O_APPEND, 0600);
        /* SEG FAULT HERE!!!! */
        fprintf(filePointer, "ROOM NAME: %s\n", roomNames[randomNumber]);
您传递的唯一
open()
标志是
O_APPEND
,但是
open()
还需要至少一个
O_RDONLY
O_WRONLY
O_RDWR
O_EXEC
O_SEARCH
标志。(后两个很少使用。)

您的代码应该类似于

        file_descriptor = open(roomFilePath, O_RDONLY | O_APPEND, 0600);
Per:

简介

#include <sys/stat.h> #include <fcntl.h>

int open(const char *path, int oflag, ...);
filePointer
变量尚未在发布的代码中初始化,因此使用该值会导致分段错误。

请尝试以管理员身份运行代码(.exe)。