Проблемы с чтением слов из текстового файла в 2d Array - PullRequest
0 голосов
/ 17 ноября 2011

Я недавно запустил программу, в которой мне нужно отсортировать список гостей, но общие сведения о проблеме не имеют отношения к проблеме, с которой я столкнулся.

Что ж, я хочу отсканировать сначала и последнееимена из файла ОТДЕЛЬНО, что я знаю, что вы делаете, сканируя их как строки.Тем не менее, мы только начали использовать строки, и у меня небольшой пердеж, и я искал места, но я не могу понять, как это сделать.У меня также возникают проблемы при структурировании массива внутри циклов for.С тех пор, как вышел Скайрим, мой разум был полностью вне школы :).Вот текстовый файл ввода:

//First number is the amount of families on the list, second number is the room capacity, ignore that for now.

10 30 

//Format = First Name, Last Name, Number of Family Members (ignore), Priority Level (ignore)

BEN JOHNSON 4 2 

DOUG ESPINOSA 3 2

SARAH TELLINGER 5 3

GRANT THOMPSON 5 2

JENNIFER WEST 7 6

JACKSON JOHNSON 1 5

MARTY MCFLY 4 1

ELIZABETH JAMES 2 6

MICKEY MOUSE 2 4

RAJ SHAH 2 5

Вот мой код на данный момент: предположим, MAX_FAMILY_MEMBERS = 10 и MAX_NAME_LENGTH = 20

void Read_First_Name(FILE *ifp, char First_Name[//Assume MAX_FAMILY_MEMBERS is here][MAX_NAME_LENGTH]){

int i, j;

for(i = 0; i < MAX_FAMILY_MEMBERS; i++) 
{
    for(j = 0; j < MAX_NAME_LENGTH; i++) 
    {
        fscanf("%s", First_Name[i][j]);
    }
}}

Я уверен, что это, скорее всего, неправильно, но я 'Я совершенно сбит с толку и из этого.Если есть какие-либо вопросы о моей программе, пожалуйста, задавайте.

Ответы [ 3 ]

0 голосов
/ 18 ноября 2011

Полагаю, вы хотите отсортировать семьи по уровню их приоритетности. В коде, который вы написали,

Ваш синтаксис fscanf неверен. Пройдите синтаксис еще раз.

    for(i = 0; i < MAX_FAMILY_MEMBERS; i++) 
    {
    for(j = 0; j < MAX_NAME_LENGTH; i++) 
    {
    fscanf("%s", First_Name[i][j]);
    }
    }

Хорошо, что вы хотите читать построчно (семья за семьей), но то, как вы читаете каждую семью, является неправильным.

Спецификатор формата% s читает всю строку, пока не встретит пробел. так что второй цикл for очень грязный.

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

    #define NUMBEROFFAMILIES 10
    #define FAMILYNAMELENGTH 20

    char firstName[NUMBEROFFAMILIES][FAMILYNAMELENGTH]; // to store first name 
    char secondName[NUMBEROFFAMILIES][FAMILYNAMELENGTH]; // to store second name
    int familtyPriority[NUMBEROFFAMILIES][1]; // to store priority

    int i, j;

    for(i = 0; i < MAX_FAMILY_MEMBERS; i++){
        fscanf(ifp,"%s",firstName[NUMBEROFFAMILIES]); // read first name
        fscanf(ifp,"%s",secondName[NUMBEROFFAMILIES]); // read second name
        fscanf(ifp,"%d", &j); // Ignore family members count
        fscanf(ifp,"%d", &familtyPriority[NUMBEROFFAMILIES][1]); // family priority
   }

РЕДАКТИРОВАНИЕ ДЛЯ СЛЕДУЮЩЕГО ВОПРОСА

Вы хотите отсортировать на основе уровня приоритета.

       int familtyPriorityCopy[NUMBEROFFAMILIES][1]; // to store priority
       int familyOrder[NUMBEROFFAMILIES][1]; // to store the proper order.
       // initialize them
       for (i=0;i<NUMBEROFFAMILIES;i++){
          familtyPriorityCopy[i][1] = familtyPriority[i][1];
          familyOrder[i][1] = i;
       }
       // sorting [insertion sort]           
       for (i=1;i<NUMBEROFFAMILIES;i++){
         for (j=0;j<i;j++){
           if (familtyPriorityCopy[j][1] < familtyPriorityCopy[i][1]){
              swap(familtyPriorityCopy[i][1],familtyPriorityCopy[j][1]);
              swap(familyOrder[i][1], familyOrder[j][1]);
           }
         }
       }

В конце сортируется массив familtyPriorityCopy. Но это не то, что важно. Массив familyOrder - это то, что указывает на правильный порядок. Мы будем использовать этот массив для печати в правильном порядке.

   for(i = 0; i < MAX_FAMILY_MEMBERS; i++){
        printf("%s",firstName[familyOrder[i][1]][1]); // read first name
        printf("%s",secondName[familyOrder[i][1]][1]); // read second name
        printf("%d", familtyPriority[familyOrder[i][1]][1]); // family priority
   }
0 голосов
/ 19 ноября 2011
void Read_And_Store(FILE *ifp, int FAMILIES_KNOWN, char First_Name[][MAX_NAME_LENGTH], char Last_Name[][MAX_NAME_LENGTH], int Family_Members[], int Priority[]){
int i;

for(i = 0; i < FAMILIES_KNOWN - 1; i++)
{
    fscanf(ifp, "%s", First_Name[i]);
    fscanf(ifp, "%s", Last_Name[i]);
    fscanf(ifp, "%d", &Family_Members[i]);
    fscanf(ifp, "%d", &Priority[i]);
}}

Вот что я сделал, и он отлично работает, когда я его распечатываю. Тем не менее, я пробовал кучу вещей, пытаясь отсортировать распечатанный список по уровню приоритета, но ни один из них не увенчался успехом ... какие-нибудь идеи? После того, как я уладил сортировку, остальное - просто базовая логика и обмен.

0 голосов
/ 18 ноября 2011

Это просто, если вы используете fgets с sscanf в одном цикле, как

char line[100], firstnames[100][100], famnames[100][100];
int counter=0;

while( fgets(line,100,yourfilepointer) )
  if( sscanf(line,"%s%s",firstnames[counter],famnames[counter])==2 )
    ++counter;
...
while( counter-- )
  printf("%s %s\n",firstnames[counter],famnames[counter]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...