C - файл с целым числом и строкой (проблемы деления) - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть задача, я работаю уже несколько дней, я схожу с ума, Google не помогает, единственный выбор - спросить здесь.

Я абсолютный новичок в C.

У меня есть файл, обычный файл .txt.

Mathematics 5 1 2 3 4 5
Physics 6 1 2 3 4 5 6
Design 7 1 2 3 4 5 6 7

Первое слово - это «курс», первое число - это количество оценок по этому курсу, например, математика, первое число.5 и у меня 5 оценок, 1 2 3 4 5, то же самое с другими курсами.

Мне нужно создать 3 разных массива.

  1. Массив курсов ("Математика »,« Физика »,« Дизайн ») и, конечно, не руками, а взяв все это из ФАЙЛА.

  2. Массив количества оценок (Первое число в каждой строке),

  3. Массив средних оценок (Все числа, кроме первого на каждомline),

МОЯ ОСНОВНАЯ ПРОБЛЕМА:

Я не могу разделить свой файл .txt, чтобы получить только строку (математика, физика и дизайн).

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

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

int main () {
FILE *fp;
fp = fopen("C:\\Project\\project.txt", "r"); //opening already created file
int grades[500];
char courses[300];

for (int i = 0; i < 300; ++i) {
    fscanf(fp, "%s", &courses[i]);
    if(isdigit(courses[i]))
    fscanf(fp, "%d", &grades[i]);
}

fclose(fp);
return(0);
}

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

Еще раз, сначала мне нужно взятьназвания этих курсов, "Математика", "Физика" и "Дизайн" в виде строки, а затем перейти к числам.

Заранее спасибо

Ответы [ 2 ]

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

Вы можете решить эту проблему, читая файл строку за строкой, используя fgets (), и извлекая каждое слово в строке, используя strtok (). Strtok может разделить строку на слова, если мы дадим разделитель как пробел. Ниже я даю кодизвлечь курсы и общее количество оценок в my.txt в отдельный массив.Неопределенный код, написанный мной, приведен ниже.

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
void print_word (char *str ,int i);
static char content[10][40];
char courses[10][20];
int total_num_grades[10];
int line_count =0 ;

void parse_word (char *str ,int line_num)
{
        char *temp ;
        int word_num = 0;
        printf ("Splitting string \"%s\" into tokens:\n",str);
        temp  = strtok (str," "); //taking first word of line
        strcpy(courses[line_num] ,temp);
        temp = strtok (NULL, " "); //taking second word of line
        total_num_grades[line_num] = atoi(temp);


}

void print_result()
{
        printf("courses in the text \n\n");
        for(int i = 0; i <line_count ; i ++)
        {
                printf("%s\n",courses[i]);
        }
        printf ("\n\nnumber of grade array \n\n");
        for(int i = 0;i < line_count ;i ++)
        {
                printf("%d\n",total_num_grades[i]);
        }
}

int main () {
        FILE *fp;
        int len = 0,read = 0;
        fp = fopen("my.txt", "r");
        while ((fgets(content[line_count], 400, fp))) {
                printf("%s", content[line_count]);
                line_count ++;
        }
        for (int line_num = 0; line_num < line_count ; line_num++)
        {
         parse_word(&content[line_num][0],line_num);

        }
        print_result();
        return(0);
}

Пример использования strtok

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

fscanf(, "%s", buffer) читает строку до пробела и помещает результат в буфер.

Первый вызов fscanf(fp, "%s", courses); прочитает математику и сохранит слово в массиве курсов. Второй вызов fscanf(fp, "%s", courses); прочитает 5 и сохранит символ в массиве курсов

Вам нужно будет преобразовывать символы в числа, проверять наличие новых строк, обрабатывать ошибки - что если входящий символ не является цифрой и т. Д.?

Ваш первый вызов fscanf (fp, "% s" и курсы [i]); получает название курса. Вторая итерация вашего цикла даст вам «M1thematics» на курсах. Вам не нужна [я] часть. Вы должны изменить свой цикл. И что это за произвольное число 300?

Еще один совет: & courses [0] указывает на начало массива, также как и на курсы. & курсы [1] указывают на второй элемент в курсах.

Остальное зависит от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...