Сканирование имен и странных строк: файлы - PullRequest
0 голосов
/ 14 апреля 2019

Я делаю задание для сортировки имен в списке, который находится внутри текстового файла. Я использую CodeBlocks v17.12. Я прошу код прочитать имя файла (в данном случае это Hamza) в файле, и когда он видит пробел, он должен остановиться. Однако, как только я скомпилирую его в CodeBlocks, он выплевывает: Hamza uyªn<■ ║kDu¡lDu``@

Кто-нибудь знает, что это за проблема? У меня его там нет, так как позже мне нужно будет перебирать имена.

{
    fPointerOne = fopen("DT265A.txt", "r");
    fPointerTwo = fopen("DT265C.txt", "r");
    fPointerThree = fopen("DT265B.txt", "r");
    fPointerFour = fopen("DT8900.txt", "r");

    fgets(firstNames, 11, fPointerOne);
    for (i = 0; i < SIZE; i++) {
        ClassGroup1.firstName[i] = firstNames[i];
        if (firstNames[i] == ' ') {
            goto PRINT;
        }
    }
  PRINT:
    printf("%s", ClassGroup1.firstName);

    fclose(fPointerOne);
    fclose(fPointerTwo);
    fclose(fPointerThree);
    fclose(fPointerFour);
    return 0;
}

Ответы [ 2 ]

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

следующий предложенный код:

  1. выполняет указанные функции
  2. чисто компилирует
  3. правильно проверяет наличие ошибок
  4. удаляет неиспользованные операторы

и теперь предложенный код:

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


#define MAX_NAMES    100
#define MAX_NAME_LEN 30
#define MAX_BUFFER_LEN 1024


struct CLASS_GROUP
{
    char firstName[ MAX_NAME_LEN ];
};


int main( void )
{
    struct CLASS_GROUP ClassGroup1[ MAX_NAMES ] = {'\0'};
    char inputBuffer[ MAX_BUFFER_LEN ];

    FILE *fPointerOne = fopen("DT265A.txt", "r");
    if( !fPointerOne )
    {
        perror( "fopen to read DT265A.txt failed" );
        exit( EXIT_FAILURE );
    }

    //FILE *fPointerTwo = fopen("DT265C.txt", "r");
    //FILE *fPointerThree = fopen("DT265B.txt", "r");
    //FILE *fPointerFour = fopen("DT8900.txt", "r");

    int i = 0;
    while( i < MAX_NAMES && fgets( inputBuffer, sizeof( inputBuffer ) , fPointerOne) )
    {
        char * token;
        if( (token = strtok( inputBuffer, " " )) )
        {
            strcpy( ClassGroup1[i].firstName, token);
        }

        i++;
    }

    printf("%s", ClassGroup1[0].firstName);

    fclose(fPointerOne);
    // fclose(fPointerTwo);
    // fclose(fPointerThree);
    // fclose(fPointerFour);
    return 0;
}
0 голосов
/ 14 апреля 2019

В вашем цикле вы копируете все символы до пробела, но никогда не записываете завершающий символ '\ 0' в ClassGroup1.firstName. Поэтому, когда вы печатаете, вы печатаете весь мусор после имени вплоть до первого 0x00 символа в памяти.

Кроме того, 11 в fgets, вероятно, должны быть SIZE из этого фрагмента кода. И перерыв будет лучше, чем goto.

...