Как получить файл, который находится за пределами текущего каталога, используя спецификатор формата? - PullRequest
0 голосов
/ 19 ноября 2018
char * read_file(char * filename) {
  char * file_contents = malloc(4096 * sizeof(char));

  FILE * file;
  file = fopen(filename, "r");

  fread(file_contents, 4096, sizeof(char), file);
  fclose(file);

  return file_contents;
}

char * read_flag() {
  return read_file("/flag.txt");  // outside of current working directory ;)
}

int main(int argc, char* argv[]) {
  setvbuf(stdin,  NULL, _IONBF, 0);
  setvbuf(stdout, NULL, _IONBF, 0);

  char * flag = read_flag();
  char input_filename[40];

  //Current directory is /home/problem
  printf("Current working directory is: ");
  system("pwd");

  printf("Enter a filename to print the contents of the file => ");
  scanf("%39s", input_filename);

  while ((directory_entry = readdir(directory)) != NULL) {
    if (strcmp(input_filename, directory_entry->d_name) == 0) {
      printf("File contents:\n");
      printf("%s\n", read_file(input_filename));

      return 0;
    }
  }
}

Мне нужно открыть файл, который находится за пределами этого каталога ("/flag.txt").Я пробовал что-то вроде "../" во входных данных, чтобы выйти из этого каталога, но он не работает.Я не уверен, как мне ввести имя файла так, чтобы он мог получить файл, который находится вне каталога / home / problem.В настоящее время я использую Ubuntu для этого.Я думаю, что идея должна использовать что-то вроде% s% d, когда я ввожу свои данные.Можно ли использовать какой-либо спецификатор или использовать эту программу для чтения всего содержимого?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Функция fopen может дать сбой, и вы должны с этим справиться. Прочитайте fopen (3) , open (2) , path_resolution (7) , errno (3) , чтобы понять возможные причины сбоя , Подробности могут быть связаны с файловой системой и компьютером (и могут включать аппаратные сбои).

Я рекомендую использовать perror (3) и exit (3) при ошибке (не забудьте включить оба <stdio.h> для perror и <stdlib.h> для exit):

FILE* file = fopen(filename, "r");
if (!file) {
    perror(filename);
    exit(EXIT_FAILURE);
}

тогда вы получите значимое сообщение об ошибке (в stderr) при ошибке

Мое предположение: ваша корневая файловая система корневая директория / ...) не имеют файла flag.txt, и вы можете получить то, что shell понимает из ~/flag.txt. Возможно, вы захотите получить его в своем домашнем каталоге (затем создайте путь к файлу, используя getenv("HOME") в Linux или Unix; см. this ).

Читайте также о globbing и glob (7) .

Прочитайте также какую-нибудь книгу по программированию для Linux, возможно, старую ALP .

0 голосов
/ 19 ноября 2018

Вам необходимо передать полный путь к вашему файлу, если он находится вне каталога решения, либо с \\, либо с одним /. В системе на базе Windows это будет, например, C:\\folder\\file.txt. Я не использую Linux в настоящее время, но это должно быть /home/folder/file.txt.

...