Как вы читаете целые числа из текстового файла из символов и целых чисел? - PullRequest
0 голосов
/ 15 мая 2018

У меня были проблемы с чтением и сохранением последнего набора значений из текстового файла. Например, предположим, что это напечатано в текстовом файле:

ID Grade
AA22 12
BB33 13
DD44 14

Как мне прочитать только оценки ученика и сохранить их в целое число для выполнения вычислений?

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

FILE *fp;
int counter;

int main () {
    fp = fopen ("nameoffile.txt", "r");
    int line[50];
    while (fgets(line, 50, fp) != EOF) {
       counter = counter + line;
    }
   printf("The total amount is %d", counter);
}

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

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Похоже, вы знаете, как кодировать, но не можете разобраться в проекте. Разрушение проекта становится логикой. Полезно разбить проект на части, а затем погуглить каждую точку, которую вы не понимаете. Очевидно, ваш проект перегружен информацией. Просто попробуйте в следующий раз.

И, конечно, это много, но с помощью этого метода вы сэкономите много времени в долгосрочной перспективе. ✔︎

Разбивка

• Прочитать файл

• Укажите столбец «Оценка».

• Читать только эти значения в столбце «Оценка».

• Убедитесь, что все символы значения isdigit()

• Преобразуйте значения в целые числа: atoi(), затем добавьте эти значения в массив для любого использования, которое вы хотите использовать позже. to carry out calculations как вы сказали.

Исследовательская разбивка

Чтение файла

=> C Читать текстовый файл ... Now you have access to each line

Укажите столбец «Оценка»

=> несколько пробелов в одном => by doing this step, its now easy to identify what your Columns "ID Grade ... ..." are delimited by.

=> Найти подстроку строки в C ... Now you know you're currently on the line of your HEADERS ... You'll use this headers to figure out what column your grades are under.

=> Используя пример strstr(), который вам предоставил отличный интернет, вы теперь получаете в своем распоряжении порядковый номер начального символа слова «Оценка».

=> К счастью для вас, вы уже сделали разделитель столбцов одним пробелом, так что теперь вы перебираете строку, пока не достигнете этого номера индекса.

=> Но при этом вам нужно посчитать количество пробелов, которые вы встретите. Потому что, когда ваш цикл достигает индекса, у вас будет номер столбца ваших оценок - "Оценка", который на самом деле является не чем иным, как количеством пробелов.

Убедитесь, что все символы значения представляют собой цифры

isdigit ()

=> цикл до столбца, в котором находится значение вашей оценки ... вы можете сделать это, потому что вы знаете номер столбца и разделитель столбцов.

=> когда вы достигнете этой точки в строке, начните проверять, если каждый символ после этого isdigit(). Под «каждым символом после этого» я ​​подразумеваю все символы до пробела.

=> если вы столкнулись с символом, который является чем-то другим, то выведите небольшую синтаксическую ошибку или что-то более крутое, чем это. ваша программа!

=> Теперь, когда вы знаете, что значение оценок - это все цифры, вы хотите atoi () этого плохого парня. но как ? как то так ... ... this example code is how to get that value out of the whole string. Now you need to take that value in atoi(value).

=> тогда вы добавите возвращаемое значение atoi(value) к вашим значениям

Удачи

0 голосов
/ 15 мая 2018

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

Необходимо выполнить много проверок на ошибки, но я оставил это вам, чтобы выяснить, что нужно улучшить.

Я предлагаю вам сначала проанализировать это и понять, что именно происходит, потому что в вашем коде было много основных ошибок.

int main(void)
{
    FILE *fp;

    fp = fopen("nameoffile.txt", "r");

    char line[200];
    char ids[20][20];
    int grades[20];
    int cnt;

    cnt = 0;

    while (fgets(line, sizeof(line), fp) != NULL)
    {
        if(cnt)
            sscanf(line, "%s %d", ids[cnt - 1], &grades[cnt - 1]);

        cnt++;
    }

    printf("ID GRADE\n");
    for(int i = 0; i < cnt - 1; i++)
    {
        printf("%s %d\n", ids[i], grades[i]);
    }

    return 0;
}
...