#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; }
. В противном случае, если задано меньше требуемого количества аргументов, все пойдет плохо — быстро.