2017-05-07 111 views
-1

我試圖打開文件並使用C追加到它們。我基於進程ID動態命名目錄,並根據隨機選擇的「房間」創建文件名在循環。我的意圖是打開文件,將房間名稱附加到文件中,然後關閉文件並移動到下一個房間並執行相同的功能。我遇到的問題是「開放」。它似乎只返回-1,這表明一個錯誤。該錯誤消息指出「權限被拒絕」。我很困惑,因爲我似乎在open函數中設置了適當的權限。我嘗試過使用fopen(),但是這導致產生了分段錯誤11.我的roomFilePath聲明和用法有問題,還是我的打開用法不正確?以下是包含該問題的代碼部分。 makeRooms()函數是我檢查文件是否被正確打開的地方。謝謝!嘗試追加到文件時拒絕的權限C

#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++; 
     } 

    } 

} 
+0

嘗試以管理員身份運行您的代碼(.exe)。 –

回答

0

首先,你在這一行缺少必需的flags參數部分open()

 file_descriptor = open(roomFilePath, O_APPEND, 0600); 

你傳遞的唯一open()標誌O_APPEND,但open()還需要至少一個的O_RDONLY,O_WRONLYO_RDWR,O_EXECO_SEARCH標誌。 (最後兩個很少使用。)

你的代碼應該是這樣的

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

the POSIX standard for open()

提要

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

int open(const char *path, int oflag, ...); 

...

oflag的值由以下列表中的標誌 的按位或值構成,該列表在<fcntl.h>中定義。申請應 指定的oflag值的前五個值(文件存取方式)以下 的只有一個:

了O_EXEC

公開賽只執行(非目錄文件)。如果將此標誌應用於目錄,則結果爲 未指定。

O_RDONLY

僅供閱讀。

O_RDWR

可供閱讀和寫作。如果將此標誌 應用於FIFO,則結果不確定。

O_SEARCH

打開的目錄僅用於搜索。如果將此 標誌應用於非目錄文件,結果未指定。

O_WRONLY

僅供打印。

在你貼的代碼,當然你在該行獲得分割故障:

 /* SEG FAULT HERE!!!! */ 
     fprintf(filePointer, "ROOM NAME: %s\n", roomNames[randomNumber]); 

filePointer變量在你發佈的代碼沒有被初始化,所以使用值導致分段錯誤。