Функция C, возвращающая различные значения при вызове из основной функции - PullRequest
0 голосов
/ 10 января 2019

Я написал программу, которая читает значения из файла. Данные в файле представлены в следующем формате.

    100       Full Name       SomeDetails.

    234       Full Name       SomeDetails

Ниже приведена программа, которую я написал.

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 10
struct student
{
int rollno;
char name[20];
char course[25];
};

int main()
{
FILE *fptr;
fptr=fopen("records.txt","r");
struct student s[10];
int i=0,tstudent=0;
char che;
char line[100];

//SECTION : 1.1 -> READING NUMBER OF LINES

while(!feof(fptr))
{
    che=fgetc(fptr);
    if(che=='\n')
    {
        tstudent++;
    }
}

printf("Total Lines in File = %d\n",tstudent);
fclose(fptr);


    //SECTION : 1.2 -> READING RECORDS FROM FILE

fptr=fopen("records.txt","r");
char newString[20][20];
int ii,j,ctr;
j=0;
ctr=0;
for(i=0; i<tstudent; i++)
   {

       fgets(line,100,fptr);
       printf("Value of Line %d = %s",i,line);
       for(ii=0; ii<=(strlen(line)); ii++)
       {
           // if tab or NULL found, assign NULL into newString[ctr]
           if(line[ii]=='\t'||line[ii]=='\0')
           {
               newString[ctr][j]='\0';
               ctr++;  //for next word
               j=0;    //for next word, init index to 0
           }
           else
           {
               newString[ctr][j]=line[ii];
               j++;
           }
       }

   }

   for(ii=0; ii < ctr; ii++)
   {
       printf("\n%s",newString[ii]);
   }

   printf("Value of ctr = %d",ctr);
   fclose(fptr);
   }

Вышеупомянутый код работает нормально, НО весь код находится в основной функции, но я хочу создать отдельную функцию, которая может быть вызвана из основного файла и возвращать мне все данные файла в двухмерном или одномерном массиве в качестве возвращаемого значения ,

Любая помощь / предложения будут оценены.

Я пытался использовать CODE как отдельную функцию. НЕ РАБОТАЕТ.

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

 char readfile(int tstudent,FILE* filename)
 {

 //FUNCTION TO READ RECORDS FROM FILE.

FILE *fptr;
int i,k;
char line[100];    
char newString[20][20];
int j=0,ctr=0;
fptr=fopen("records.txt","r");
for(i=0; i<tstudent; i++)
{
    fgets(line,100,fptr);
    printf("Value of Line %d = %s",i,line);
    for(k=0; k<=(strlen(line)); k++)
    {
        // if tab or NULL found, assign NULL into newString[ctr]
        if(line[k]=='\t'||line[k]=='\0')
        {
            newString[ctr][j]='\0';
            ctr++;  //for next word
            j=0;    //for next word, init index to 0
        }
        else
        {
            newString[ctr][j]=line[k];
            j++;
        }
    }
}
return newString;
}

Я определил новую переменную char results [] в основной функции .. и попытался вызвать функцию следующим образом

 results[]=readfile(tstudent,fptr)

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

1 Ответ

0 голосов
/ 10 января 2019
char readfile(int tstudent,FILE* filename)
   ...
   char newString[20][20];
   ...
   return newString;

Это не может быть хорошей вещью, верно? Вы определяете readFile, чтобы возвращать один единственный символ (не указатель, только один байт), а затем возвращаете массив. Не стоит удивляться, что компилятор пожаловался.

Если вы «исправляете» переопределение возвращаемого типа, у вас все еще есть проблема, потому что newString - это автоматическая локальная переменная. Хранилище (память), которое оно определяет, не определено вне функции.

Самый простой способ для функции заполнить структуру (или массив) в C - это передать вызывающей функции ее в качестве параметра функции. Таким образом, вы получите что-то вроде:

int readfile( FILE* input, char newString[][20], int tstudent )

где newString определяется так же, как у вас, но вызывающей стороной, а не в файле чтения. Ср stdio функционирует как fgets; большинство из них требуют от вызывающего абонента определить буфер, в который они читают.

Я просто укажу еще на несколько ошибок.

Каждый раз, когда вы вызываете функцию, особенно функцию ввода-вывода, проверяйте наличие ошибок. Вы можете прочитать tstudent записей, но сколько их? Если вы попросите 5 и найдете только 1, что тогда? Ваш цикл чтения должен проверять конец файла, а readfile должен возвращать количество прочитанных записей, иначе вызывающий никогда не узнает. Сравните с тем, как работает fread (3). Эти парни из Unix знали кое-что о том, как определить функцию!

Теперь ваша функция выглядит примерно так:

int readfile( FILE* input, char newString[][20], int tstudent ) {
  char line[100], *s;
  int i=0;

  for( ; i < tstudent && (s = fgets(line, sizeof(line), input)) != NULL; i++ ) {
    /* do stuff with line */ 
  }
  /* check for EOF/error if s is NULL, and report */
  return i;
}
...