我现在刚在学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;
}
黄舟2017-04-17 15:26:13
함수 내부에 선언된 배열을 직접 반환하지 마세요. 함수가 종료된 후 스택이 재활용됩니다. 또는 fgets를 사용한 것처럼 함수 외부에 버퍼를 정의한 다음 버퍼와 길이를 함수 매개변수로 전달합니다. 또는 함수 내부에서 char 메모리 조각을 malloc하고 내부적으로 tail 0을 쓴 다음 이 주소를 반환하고 사용 후 외부에서 해제할 수 있습니다. 물론 이것은 파괴 함수를 캡슐화할 수 있습니다. 사용하려면 반환된 주소를 매개변수로 전달하고 get 함수에서 요청된 모든 메모리를 해제합니다.
阿神2017-04-17 15:26:13
데이터가 스택에 있으며, 함수가 반환되면 스택이 재활용됩니다. 데이터에 액세스하면 예측할 수 없는 오류가 발생합니다.
메인 함수에서 데이터를 선언한 후, 매개변수를 통해 getFileRows에 데이터를 전달하여 데이터를 받습니다.
PHP中文网2017-04-17 15:26:13
데이터 배열은 함수 외부에서 선언해야 하며, 배열 주소와 배열 길이는 매개변수로 함수에 전달되어야 하며, 데이터는 함수 내부에서 읽고 저장되어야 합니다(배열 이름은 포인터로 사용되며, 배열은 더 이상 함수 내에서 선언되지 않습니다.)