使用 ANSI 函数获取文本文件的特定行
Getting to specific lines of a text file using ANSI functions
试图在 c 中创建一个函数,该函数可以到达 CSV 文件中的特定行(类似于 getline())。我只被允许使用 ANSI 89/99 标准。这是我到目前为止所写的内容:
char * getline(FILE * fi,size_t line_length,size_t line_number)
{
size_t i;
char * aux_string;
char * p;
if (fi==NULL)
return NULL;
if ((aux_string = malloc(line_length*sizeof(char)))==NULL)
return NULL;
i=0;
while(fgets(aux_string,line_length,fi)!=NULL||feof(fi)!=0)
{
if (i==line_number)
{
if ((p=strchr(aux_string,'\n'))!=NULL)
{
*p='[=10=]';
}
return aux_string;
}
i++;
}
return NULL;
}
这对于单次调用 getline() 来说工作得很好。但是,如果像下面的示例那样调用该函数:
puts(getline(file_a,MAX_LENGTH,0));
puts(getline(file_a,MAX_LENGTH,0));
它输出文件中紧接在下方的行,以及所需的行。
我怎样才能避免这种情况?是什么原因造成的?谢谢
FILE*
记住您在文件中结束的位置。所以你第二次调用 fread
文件已经读取了第一行,所以你从第二行开始读取。您需要 fseek(fi, 0, SEEK_SET)
将文件倒回到开头。
char * getline(FILE * fi,size_t line_length,size_t line_number)
{
if (fseek(fi, 0, SEEK_SET) != 0) {
// handle error
}
// rest of your function
备注:
- rewind 等同于
fseek(.., 0, SEEK_SET)
,但不提供错误处理(weii,除了 ferror
)。
puts(getline(file_a,MAX_LENGTH,0));
泄漏在 getline
内分配的内存。你应该char *pnt = getline(...); puts(pnt); free(pnt)
永远记得捡垃圾。
while
循环中的 feof(fi)!=0
条件看起来多余。如果文件没有更多行,fgets
会告诉你。
- 我建议将该函数重命名为
mygetline
之类的名称,以免混淆其他人。函数 getline
已经是一个已经存在很长时间的 POSIX function。
试图在 c 中创建一个函数,该函数可以到达 CSV 文件中的特定行(类似于 getline())。我只被允许使用 ANSI 89/99 标准。这是我到目前为止所写的内容:
char * getline(FILE * fi,size_t line_length,size_t line_number)
{
size_t i;
char * aux_string;
char * p;
if (fi==NULL)
return NULL;
if ((aux_string = malloc(line_length*sizeof(char)))==NULL)
return NULL;
i=0;
while(fgets(aux_string,line_length,fi)!=NULL||feof(fi)!=0)
{
if (i==line_number)
{
if ((p=strchr(aux_string,'\n'))!=NULL)
{
*p='[=10=]';
}
return aux_string;
}
i++;
}
return NULL;
}
这对于单次调用 getline() 来说工作得很好。但是,如果像下面的示例那样调用该函数:
puts(getline(file_a,MAX_LENGTH,0));
puts(getline(file_a,MAX_LENGTH,0));
它输出文件中紧接在下方的行,以及所需的行。 我怎样才能避免这种情况?是什么原因造成的?谢谢
FILE*
记住您在文件中结束的位置。所以你第二次调用 fread
文件已经读取了第一行,所以你从第二行开始读取。您需要 fseek(fi, 0, SEEK_SET)
将文件倒回到开头。
char * getline(FILE * fi,size_t line_length,size_t line_number)
{
if (fseek(fi, 0, SEEK_SET) != 0) {
// handle error
}
// rest of your function
备注:
- rewind 等同于
fseek(.., 0, SEEK_SET)
,但不提供错误处理(weii,除了ferror
)。 puts(getline(file_a,MAX_LENGTH,0));
泄漏在getline
内分配的内存。你应该char *pnt = getline(...); puts(pnt); free(pnt)
永远记得捡垃圾。while
循环中的feof(fi)!=0
条件看起来多余。如果文件没有更多行,fgets
会告诉你。- 我建议将该函数重命名为
mygetline
之类的名称,以免混淆其他人。函数getline
已经是一个已经存在很长时间的 POSIX function。