Пытаюсь открыть неизвестный файл из аргумента командной строки, но по какой-то причине не могу открыть

#c #file

#c #файл

Вопрос:

Пытаюсь открыть .txt файл из аргументов командной строки, ./a.out courses.txt data.txt , в пользовательской функции, но файлы просто не будут прочитаны. Я действительно получил пару ошибок сегментации, когда попытался закрыть файлы, но они исчезли после того, как я отключил fclose функции. Любая помощь приветствуется. Спасибо. ПРИМЕЧАНИЕ: я студент первого курса, поэтому я не очень разбираюсь в коде или в том, как правильно задавать вопросы здесь, заранее приношу свои извинения.

Main.c:

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

   #include "givenA3.h"

   int main (int argc, char **argv)
   {

       int userInput;
       int x = 0;
       char *filename [50];
       char courseNames[NUMBER_COURSES][50];
       char profNames[NUMBER_PROFS][30];
       int courseID[NUMBER_COURSES];
       char data[NUMBER_PROFS][NUMBER_COURSES];
       int n = 0;
   
       *filename = argv[1];   // Sets filename to 1st argument.
       readCourseProfData (filename [50], courseNames, profNames, amp;courseID[NUMBER_COURSES]);
   
       *filename = argv[2];    // Sets filename to 2nd arguemtn.
       readData (filename [50], data);
   }
 

A3.c:

     void readCourseProfData (char filename [50], char courseNames[NUMBER_COURSES][50], char            
    profNames[NUMBER_PROFS][30], int courseID[NUMBER_COURSES])
    {

    int lines = 100;
    char buff [lines];
    int i;

    FILE* inFile;
    inFile = fopen(filename, "r");   // Opens file from 2nd argument vector and reads it

    if (inFile == NULL)
    {
        printf("Error! Can not read courses.txtn");
    }

    else
    {
        while (fgets(buff, lines, inFile))    // Reads line by line
        {
            for (i = 0; i < NUMBER_COURSES; i  )    // Adds values to array
            {
                sscanf(buff, "%s[^tn]", courseNames [i]);
            }

            for (i = 0; i < NUMBER_PROFS; i  )    // Adds values to array
            {
                sscanf(buff, "%s", profNames [i]);
            }

            for (i = 0; i < NUMBER_COURSES; i  )    // Adda values to array
            {
                sscanf(buff, "%d", amp;courseID [i]);
            }
        }
    }
}
 

Комментарии:

1. Вам нужно пометить свой вопрос языком программирования, чтобы люди, следующие этому тегу, могли его видеть.

2. readCourseProfData (filename, ... ? Что такое [50] ? То же самое для readData (filename, ...

3. *filename = argv[1]; Это эквивалентно filename[0] = argv[1]; . Но затем вы переходите filename[50] к readCourseProfData тому, что является неправильным и выходит за рамки. Вы уверены, что хотели filename быть массивом из 50 указателей на символ, что char *filename [50]; и означает?

4. Кроме того, вы не можете вызвать sscanf(buff, "%s[^tn]", courseNames [i]); внутри цикла — вы читаете то же значение. Вам нужно вычислить sscanf (buf offset, .... Next [^tn] не так, как вы думаете. пробел в строке sscanf() формата указывает sscanf на ввод любого количества символов пробела, но поскольку спецификатор преобразования не следует, пробелы не игнорируются. Смотрите man 3 sscanf под заголовком "A directive is one of the following:" (обратите внимание на порядок того, что составляет директиву)

5. Вы хотите объявить char *filename; , тогда вы можете назначить filename = argv[1]; . Но прежде чем назначать какие-либо аргументы, вам нужно проверить if (argc < 3) { /* handle error */; return 1; } . В противном случае, если задано меньше требуемого количества аргументов, все пойдет плохо — быстро.