Добавление символов в массив как целые числа в C - PullRequest
0 голосов
/ 06 марта 2012

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

новый код редактирования:

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

int main (void)
{
    FILE* fp;
    const char filename[] = "test.txt";
    char ch;
    int num[1000];
    int j = 0;
    char temp;

    fp = fopen(filename, "r");
    if( fp == NULL )
    {
        printf( "Cannot open file: %s\n", filename);
        exit(8);
    }

    while(!feof(fp))
    {
        temp = fgetc(fp);
        num[j] = temp - '0';
        j++;
    }
    printf("First in the array is: %d,  last is; %d", num[0], num[999]);


    fclose(fp);

    return EXIT_SUCCESS;
}

test.txt

731671765313306249192251196744265747423553491949349698352031277450632623957831801698480186947885184385861560789112949495459501737958331952853208805511
125406987471585238630507156932909632952274430435576689664895044524452316173185640309871112172238311362229893423380308135336276614282806444486645238749
303589072962904915604407723907138105158593079608667017242712188399879790879227492190169972088809377665727333001053367881220235421809751254540594752243
525849077116705560136048395864467063244157221553975369781797784617406495514929086256932197846862248283972241375657056057490261407972968652414535100474
821663704844031998900088952434506585412275886668811642717147992444292823086346567481391912316282458617866458359124566529476545682848912883142607690042
242190226710556263211111093705442175069416589604080719840385096245544436298123098787992724428490918884580156166097919133875499200524063689912560717606
0588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450

Кто-то, кто указал мнеправильное направление было бы здорово.

Ответы [ 3 ]

1 голос
/ 06 марта 2012

Я перефразирую весь свой ответ после того, как вы добавили содержание test.txt.

Вместо

while(!feof(fp))
{
    temp = fgetc(fp);
    num[j] = temp - '0';
    j++;
}

Изменить на

while(!feof(fp)&& (j<1000))
{
    temp = fgetc(fp);
    if ( temp != EOF && ( temp>='0' && temp<='9') ) // To filter out non-numbers and also the last EOF
       num[j++] = temp - '0';

}

И вместо

printf("First in the array is: %d,  last is; %d", num[0], num[999]);

Изменить на

printf("First in the array is: %d,  last is; %d", num[0], num[j-1]); // j-1 so that it works even when there are less than 1000 numbers and to keep it generic

И все готово!

1 голос
/ 06 марта 2012

Вы не можете динамически выделить массив int в C, как это, поэтому

int num[count]

не будет работать.Используйте максимальное значение или динамическое распределение, используя malloc.

Также вы не можете передать один символ в atoi, вам нужно передать массив из 2 элементов с вторым элементом равным 0, или вы можете просто использовать

num[j] = temp - '0';

Также проверяя fp для EOF во втором цикле, в то время как неправильный, используйте feof(fp) или temp != EOF

Надеюсь, что это поможет вам немного заработать.

0 голосов
/ 06 марта 2012

Следующее приложение работает и выдает следующий вывод (в текстовом файле, содержащем 1 3 5 5565) enter image description here

int main (void)
{
    FILE* fp;
    const char filename[10] = "test.txt";
    char ch;
    int count = 0;
    int num[100];


    fp = fopen(filename, "r");
    if( fp == NULL )
    {
        printf( "Cannot open file: %s\n", filename);
        exit(8);
         } 

    while (fscanf(fp, "%d", &num[count]) !=EOF){
          count++;
         }

    rewind(fp);

    printf("Text file contains: %d\n", count);
    printf("First in the array is: %d,  last is; %d\n", num[0], num[count-1]);


    fclose(fp);
    system("pause");
    return EXIT_SUCCESS;
}

, если вы хотите, чтобы массив динамически изменялся, необходимо выполнить цикл черезэлементы и подсчитайте их, прежде чем добавлять их, как вы делали это в своем примере в основном коде.И вместо while (fscanf(fp, "%d", &num[count]) !=EOF){ вы используете счетчик температуры для индексации элементов

Надеюсь, это поможет

...