Сохранить данные в файл: где адрес файла указан пользователем - PullRequest
0 голосов
/ 04 мая 2011

Я запустил симуляцию для некоторых данных y1, y2, .. yn и сгенерировал векторы w, mu. При каждом моделировании эти результаты сохраняются в файле, скажем (обычно w и mu - очень длинные векторы, 10000 записей)

/home/carlos/Documents/Results/w.txt
/home/carlos/Documents/Results/mu.txt

Но если я хочу запустить свой алгоритм с другим набором данных и не хочу потерять предыдущие результаты, я должен перейти непосредственно в мой код на C и изменить его (или переместить w.txt, mu.txt на другой файл)

/home/carlos/Documents/Results/OtherData/w.txt
/home/carlos/Documents/Results/OtherData/mu.txt

Я не хочу каждый раз заходить в свой C-код, чтобы изменить адрес (или перемещать снова и снова w.txt, mu.txt), я хотел бы просто создать новую папку с именем: OtherData и store данные там просто дают адрес

/home/carlos/Documents/Results/OtherData/

в качестве ввода для кода

Я сделал очень упрощенный пример, но он не работает, кто-нибудь может мне помочь?

#include <stdio.h>
#include <string.h>

void main(char *dir){
  char dir_happy[100] = *dir, dir_sad[100]=*dir;
  FILE *ffile_happy, *ffile_sad;

  strcat(dir_happy, "/happy.txt");
  strcat(dir_sad, "/sad.txt");

  ffile_happy = fopen("dir_happy.txt", "w");
  ffile_sad = fopen("dir_sad.txt", "w");

  fprintf(ffile_happy, "Hello!, happy world\n");
  fprintf(ffile_sad, "Hello!, sad world\n");

  fclose(ffile_happy);
  fclose(ffile_sad);
}

Ответы [ 3 ]

2 голосов
/ 04 мая 2011

У вас есть аргументы для main() неправильно.Правильный прототип:

int main(int argc, char *argv[]);

, где argc - количество аргументов, а argv - вектор, содержащий каждый аргумент.Первый аргумент (в argv[0]) - это, как правило, имя программы.

1 голос
/ 04 мая 2011

непроверенная. Веселитесь.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_FILENAME_LENGTH 100
#define DEFAULT_DIR "."
#define HAPPY_NAME "/happy.txt"
#define SAD_NAME "/sad.txt"

int main(int argc, char **argv) {
    char name1[MAX_FILENAME_LENGTH+1], name2[MAX_FILENAME_LENGTH+1];
    size_t dirlen;
    char *dir = DEFAULT_DIR;
    FILE *ffile_happy, *ffile_sad;

    if (argc == 2) {
        dir = argv[1];
    }
    dirlen = strlen(dir);
    if (len + strlen(HAPPY_NAME) > MAX_FILENAME_LENGTH) {
        fprintf(stderr, "Directory name too long. Program aborted.\n");
        exit(EXIT_FAILURE);
    }
    if (len + strlen(SAD_NAME) > MAX_FILENAME_LENGTH) {
        fprintf(stderr, "Directory name too long. Program aborted.\n");
        exit(EXIT_FAILURE);
    }
    strcpy(name1, dir); strcat(name1, HAPPY_NAME);
    strcpy(name2, dir); strcat(name2, SAD_NAME);

    ffile_happy = fopen(name1, "w");
    if (ffile_happy == NULL) {
        fprintf(stderr, "Unable to open file \"%s\" for writing. Program aborted.\n", name1);
        exit(EXIT_FAILURE);
    }
    ffile_sad = fopen(name2, "w");
    if (ffile_sad == NULL) {
        fprintf(stderr, "Unable to open file \"%s\" for writing. Program aborted.\n", name2);
        fclose(ffile_happy);
        exit(EXIT_FAILURE);
    }

    /* use files */

    fclose(ffile_happy);
    fclose(ffile_sad);
    return 0;
}
0 голосов
/ 04 мая 2011

void main(char *dir) - это проблема.

Main принимает 2 аргумента int/void main(int argc, char *argv[])

  • argc - количество аргументов для исполняемого файла.
  • argv [0] - имя файла исполняемого файла.
  • argv [1..n] - передаваемые аргументы (обычно разделяются пробелом, сдопустимые кавычки)

Итак /a.out Привет "Посмотри на меня" будет выглядеть как

  • argv [0] => './a.out'
  • argv [1] => «Привет»
  • argv [2] => «Посмотри на меня»
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...