C - Данные смешанного текстового файла> В разные массивы (Int и String) - PullRequest
0 голосов

У меня есть обычный файл "project.txt" с этими данными:

Programming 10 3 4 5 4 3 2 4 5 2 3
Mathematics 8 3 3 4 5 3 2 2 3
Physics 6 3 4 5 3 4 5
Design 6 5 4 5 3 2 4
Logistics 8 3 4 5 3 1 1 2 3

Нужно открыть этот файл, прочитать и записать все эти данные в массивы. Мне нужно как-то разделить строки и целые числа друг от друга. * НЕ НУЖНО ЕГО ПРЯМО СЕЙЧАС, но позже мне нужно будет написать текст и цифры в разные файлы. *** Нет необходимости делать это сейчас *

Просто нужно сделать это с двумя различными массивами int и char, но я сижу несколько часов и не могу найти нормального объяснения того, как отделить эту строку от других вещей.

Вот мой код, кто-нибудь может мне помочь?

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

int main(void) {
FILE *fp;
fp = fopen("C:\\Project\\project.txt", "r");
char arrayWords[140];
int i;

if(fp == NULL){
    printf("Can't Read The File!");
    exit(0);
}

for (i = 0; i < 140; i++){
    fscanf(fp, "%s,", &arrayWords[i]);
}

for (i = 0; i < 140; i++){
    printf("Number is: %s\n\n", &arrayWords[i]);
}


fclose(fp);
return 0;

}

Это вывод, который я получаю, он действительно сбивает с толку (какая-то его часть) ...

Number is: P13454324523M833453223P6345345D6545324L834531123

Number is: 13454324523M833453223P6345345D6545324L834531123

Number is: 3454324523M833453223P6345345D6545324L834531123

Number is: 454324523M833453223P6345345D6545324L834531123

Number is: 54324523M833453223P6345345D6545324L834531123

Number is: 4324523M833453223P6345345D6545324L834531123

Number is: 324523M833453223P6345345D6545324L834531123

Number is: 24523M833453223P6345345D6545324L834531123

Number is: 4523M833453223P6345345D6545324L834531123

Number is: 523M833453223P6345345D6545324L834531123

Number is: 23M833453223P6345345D6545324L834531123

Number is: 3M833453223P6345345D6545324L834531123

Number is: M833453223P6345345D6545324L834531123

Number is: 833453223P6345345D6545324L834531123

Number is: 33453223P6345345D6545324L834531123

Number is: 3453223P6345345D6545324L834531123

Number is: 453223P6345345D6545324L834531123

Number is: 53223P6345345D6545324L834531123

Number is: 3223P6345345D6545324L834531123

Number is: 223P6345345D6545324L834531123

Number is: 23P6345345D6545324L834531123

Number is: 3P6345345D6545324L834531123

Number is: P6345345D6545324L834531123

Number is: 6345345D6545324L834531123

Number is: 345345D6545324L834531123

Number is: 45345D6545324L834531123

Number is: 5345D6545324L834531123

Number is: 345D6545324L834531123

Number is: 45D6545324L834531123

Number is: 5D6545324L834531123

Думаю, проблема в указателях, но не знаю, я новичок и не могу найти никаких проблем.

Спасибо всем

1 Ответ

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

Эти списки разделенных пробелами чисел легко проанализировать с помощью функции strtol().Это хорошее решение, потому что оно легко устанавливает указатель на следующий блок пробела / не числа после числа, которое он только что преобразовал.Если нет числа для преобразования, он просто отправляет обратно исходный указатель.Таким образом, код проверяет это, чтобы знать, когда оно будет завершено.

РЕДАКТИРОВАТЬ: Обновлено для обработки имени тоже.

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

int main(void)
{
    char *number_str = "SomeWords 19 9 6 2 22 1 0 -4";
    char *ptr;
    char *next_number;
    int   numbers[1000];
    int   number_count = 0;
    char  name[100];

    next_number = number_str;

    // Copy off the name
    ptr = strchr(number_str, ' ');
    if (ptr != NULL)
    {
        strncpy(name, number_str, ptr-number_str);  // TODO - check bounds of name[]
        name[ptr-number_str] = '\0';

        // Point to the first number
        next_number = ptr+1;

        printf("Stored name [%s]\n", name);
    }

    // Then parse all the numbers
    do 
    {
        ptr = next_number;
        long num = strtol(ptr, &next_number, 10);
        if (ptr != next_number) // found one
        {
            numbers[number_count] = (int)num;
            printf("Stored %3d into numbers[%d]\n", numbers[number_count], number_count);
            number_count += 1;
        }
    } while(ptr != next_number);

    return 0;
}

Выходы:

Stored name [SomeWords]
Stored  19 into numbers[0]
Stored   9 into numbers[1]
Stored   6 into numbers[2]
Stored   2 into numbers[3]
Stored  22 into numbers[4]
Stored   1 into numbers[5]
Stored   0 into numbers[6]
Stored  -4 into numbers[7]
...