我现在刚在学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하고 내부적으로 tail 0을 쓴 다음 이 주소를 반환하고 사용 후 외부에서 해제할 수 있습니다. 물론 이것은 파괴 함수를 캡슐화할 수 있습니다. 사용하려면 반환된 주소를 매개변수로 전달하고 get 함수에서 요청된 모든 메모리를 해제합니다.
데이터가 스택에 있으며, 함수가 반환되면 스택이 재활용됩니다. 데이터에 액세스하면 예측할 수 없는 오류가 발생합니다.
메인 함수에서 데이터를 선언한 후, 매개변수를 통해 getFileRows에 데이터를 전달하여 데이터를 받습니다.
데이터 배열은 함수 외부에서 선언해야 하며, 배열 주소와 배열 길이는 매개변수로 함수에 전달되어야 하며, 데이터는 함수 내부에서 읽고 저장되어야 합니다(배열 이름은 포인터로 사용되며, 배열은 더 이상 함수 내에서 선언되지 않습니다.)