c - 使用 ANSI 函数获取文本文件的特定行

标签 c csv crud fgets ansi

试图在 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='\0';
        }

        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(...);看跌期权(点); free(pnt) 永远记得捡垃圾。
  • while 循环中的 feof(fi)!=0 条件看起来是多余的。如果文件没有更多行,fgets 会告诉您。
  • 我建议将该函数重命名为 mygetline 之类的名称,以免混淆其他人。函数 getline 已经是一个 POSIX function这已经存在很长时间了。

关于c - 使用 ANSI 函数获取文本文件的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56317325/

相关文章:

java - Spring Boot应用程序oneToMany关系中的assertTrue异常

从函数更改结构数组(从文件读取)

c# - C# MYSQL MySqlBulkLoader 可以动态转换数据类型吗?

php - AJAX:如何尽可能高效地显示/添加/编辑/删除(CRUD)?

csv - 将 array<string> 转换为字符串 pyspark 数据帧

python - 从 python 中的字典列表中写出一个 csv 文件

php - 我试图在我的 View 上显示从数据库获取的数据,但我无法显示它。 Laravel 10.x/

c - Malloc 和双重发行

c - 什么是核心文件,它为什么有用?

c - 非阻塞读函数