我现在刚在学C语言,今天想要实现一个功能:
用C语言读取一个文件的指定行,(如读取a.log文件的3--5行),现在实现了读取函数, 但在main函数调用时不知道怎么接收返回的值。
代码如下:
#include <stdio.h>
/*
读取a.log中第3行到第5行的内容
*/
#define MAXLIN 100
#define FILENAME "a.log"
char* getFileRows(char* filename,int start_line, int end_line);
int main()
{
getFileRows(FILENAME,3,5);
/*
getFileRows 函数返回的是 data[3][100] 这种的char类型数组。
getFileRows 函数返回的是char类型的数组, 我这里应该怎么定义变量,来接收返回值呢?
*/
return 1;
}
/*
读取文件, 读取 start_line 到 end_line 行之间的内容
*/
char* getFileRows(char* logfile,int start_line, int end_line)
{
int k=0,i = 0 ;
int pos = 1;
char c;
int line = end_line - start_line;
char data[line][MAXLIN];
FILE* fp = fopen(logfile,"r");
if(fp == NULL){
printf("FILE OPEN ERROR");
getchar();
exit(1);
}
while(i<start_line && !feof(fp)){
fseek(fp,pos,SEEK_SET);
while( (c=fgetc(fp)) != NULL){
pos++;
if(c == '\n'){
break;
}
}
i++;
}
for(k=0;k<=line;k++){
fgets(data[k],MAXLIN,fp);
}
return data;
}
関数内で宣言された配列を直接返さないでください。スタックは関数の終了後にリサイクルされます。または、fgets を使用したのと同じように、関数の外側でバッファーを定義し、バッファーと長さを関数パラメーターとして渡します。または、関数内で char メモリの一部を malloc し、内部で末尾 0 を書き込み、このアドレスを返し、使用後に外部で解放することもできます。もちろん、これは悪いプログラミング習慣です。その後、destroy 関数をカプセル化することもできます。使用し、返されたアドレスをパラメータとして渡し、get 関数で要求されたすべてのメモリを解放します。
データはスタック上にあり、関数が戻るときにスタックはリサイクルされます。データにアクセスすると、予期しないエラーが発生します。
main 関数でデータを宣言し、パラメーターを介して getFileRows にデータを渡してデータを受け取ります。
データ配列は関数の外で宣言し、配列アドレスと配列長をパラメーターとして関数に渡し、データを関数内で読み取って保存する必要があります (配列名はポインターとして使用され、配列は関数内で宣言されなくなりました)