从主函数调用时C函数返回不同的值

时间:2019-01-10 19:07:20

标签: c arrays function multidimensional-array

我编写了一个程序,该程序从文件中读取值。文件中的数据采用以下格式。

    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);
   }

上面的代码工作正常,但是所有代码都在main函数中,但是我想创建一个可以从main文件中调用的单独函数,并以二维或一维数组的形式返回文件的每个数据作为返回值。

任何帮助/建议将不胜感激。

我尝试遵循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 :(得分:1)

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的定义方式与您定义的方式相同,但由调用者定义,而不是在readfile中定义。 cf. stdio函数类似fgets;它们中的大多数都要求调用者定义其读入的缓冲区。

我将再指出一些错误。

无论何时调用函数(尤其是I / O函数),都要检查错误。您可能想读取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;
}