【问题标题】:fprintf() to a csv file in C by using pointer使用指针将 fprintf() 转换为 C 中的 csv 文件
【发布时间】:2021-12-02 21:30:39
【问题描述】:

我有一个这样定义的结构

typedef struct{
    int id;
    char* name;
    float percentage;
}student_t;

还有一个函数就是以这种格式打印struct的成员

"id, name, percentage\n"

但是函数接受void* val_ref //struct ptr, void* fp 我如何使它工作?函数长这样(给定的参数不能修改)

void printStudentInfo(void* val_ref, void* fp)
{
    if (val_ref != NULL)
    {
        fprintf(fp, "%d,%s,%.2f", val_ref->id, val_ref->name, val_ref->percentage);
    }
}

但我无法编译,它显示警告:deferencing void* pointer 错误:在不是结构或联合的东西中请求成员“id” 错误:在不是结构或联合的东西中请求成员“名称” 错误:在不是结构或联合的东西中请求成员“百分比”

我必须对参数 val_ref 进行类型转换吗?

【问题讨论】:

  • 是的,您必须将 void 指针类型转换回来。或者只是将函数原型更改为采用 student_t* 和 FILE* 而不是 2 个 void* 参数。为什么要以 void 指针开头?它是给定的功能吗?
  • @LouisCloete 是的,它是一个给定的函数,我不能修改参数但是当我像student_t* val_ref 那样进行类型转换时,编译器会告诉我redeclare as a different kind of symbol and previous defined in function parameter
  • 这里使用void指针没有意义,使用合适的指针类型即可。
  • val_ref->id, val_ref->name, val_ref->percentage -> ((student_t*)val_ref)->id, ((student_t*)val_ref)->name, ((student_t*)val_ref)->percentage
  • 我同意@Jabberwocky。问题是什么? void 指针有意义的唯一方法是它是否应该是“通用的”,因为它能够采用一种以上的结构类型和一种以上的输出句柄类型并将通用结构输出到通用输出句柄。

标签: c pointers struct


【解决方案1】:

fprintf(fp, "%d,%s,%.2f", val_ref->id, val_ref->name, val_ref->percentage); 在这里,您需要将val_ref 转换为它实际的指针类型:(student_t *)val_ref,然后获取结构的成员,例如((student_t*)val_ref)->id.

当您有void* 时,您的程序不知道您指向的实际数据类型。因此,尝试获取成员是非法的。使用演员表时,您明确表示val_ref 指向student_t,并且当您请求特定成员时您知道自己在做什么。

但是,不需要强制转换 fp,因为函数 fprintf 在其签名中的第一个参数为 FILE *:

int fprintf(FILE *stream, const char *format, ...);

因此,即使您将void * 作为第一个参数传递,局部变量stream 也被定义为FILE *,这就是函数的作用。

【讨论】:

  • 感谢您的回答,我必须在if 声明中进行类型转换吗?
  • @AlexHu 没有。void * 与 NULL 的比较定义明确。
  • 感谢回复
猜你喜欢
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多