Я немного новичок в программировании на Си.Мне нужна помощь, чтобы вставить строку из файла (test.txt) в массив без запятых - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь решить проблему динамического выделения памяти, читая входные данные из файла с помощью malloc (), free (), realloc ();Мне просто нужна помощь, чтобы вставить строки в массив из файла, без запятых.Мой файл test.txt выглядит следующим образом:

a, 5,0

a, 25,1

a, 1,2

r,10,1,3

f, 2

int i;

int count;

char line[256];

char *str[20];//to store the strings without commas

char ch[20];

int main (void) 

{

FILE *stream;

if ( (stream = fopen ( "test.txt", "r" )) == NULL )

{ printf ("Cannot read the new file\n");

exit (1);

}

while(fgets(line, sizeof line, stream))

{

printf ("%s", line); 

int length = strlen(line);

strcpy(ch,line);

for (i=0;i<length;i++)

{

 if (ch[i] != ',')
       {

 printf ("%c", ch[i]);   
        }

    }


}     

   //i++;




//FREE(x);
//FREE(y);
//FREE(z);

fclose (stream);

массив str [] должен хранить только такие значения, как a520.(без запятых)

1 Ответ

0 голосов
/ 17 апреля 2019

Прежде всего, НЕ используйте глобальные переменные, если это абсолютно не требуется. Я предполагаю, что вы хотите, чтобы str был массивом указателей, а str [0] хранит первую строку, str [1] хранит вторую строку и так далее. Для этого:

int line_pos = 0; //stores line_number
int char_pos = 0; //stores position in str[line_pos]
while(fgets(line, sizeof(line), stream))
    {
        printf ("%s", line); 
        int length = strlen(line);
        strcpy(ch,line);

        str[line_pos] = calloc(length, sizeof(char)); //allocating memory 

        for (i=0;i<length;i++)
        {
            if (ch[i] != ',')
            {

                *(str[line_pos]+char_pos) = ch[i]; //setting value of str[line][pos]
                char_pos++;
            }

        }
        char_pos = 0;
        line_pos++;
    }  
printf("%s", str[0]); //print first line without comma   

Обратите внимание, что он работает только для 20 строк (потому что вы объявили * str [20]), а затем для 21-й или более поздних строк это приводит к переполнению и может вызвать различные катастрофы. Вы можете включить:

if (line_pos >= 20)
    break;

в качестве меры безопасности.

Обратите внимание, что для str выделяется немного больше памяти (memory selected = memory_required + количество запятых). Чтобы предотвратить это, вы можете установить ch для текста без запятой:

for (i=0;i<length;i++)
        {
            int j = 0; //stores position in ch
            if (line[i] != ',')
            {

                ch[j++] = line[i]; 
            }

Затем выделите память для str [line_pos], например: str[line_pos] = calloc(strlen(ch0, sizeof(char));

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