如何通过引用将文件传递给函数?
Posted
技术标签:
【中文标题】如何通过引用将文件传递给函数?【英文标题】:how to pass-by-reference a file to a function? 【发布时间】:2022-01-05 02:56:43 【问题描述】:我必须做这个练习:
“在c中,创建一个函数,在文件中打印(文件必须在“wb”中打开)一个数字(以10为底)”。
练习只给出了函数的声明 “extern bool write_integer(const char 文件名, int i);” 问题是我无法在“const char 文件名”字段中传递文件,因为 const char* 与 FILE* 类型不兼容。我错了吗?
因此,我认为这个练习的问题在于这部分:传递给一个函数 非常量 char* 值。但是,我不能简单地写(主要): const char *f;然后 FILE *f = fopen... 因为这会是类型重定义错误。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
bool write_integer(const char* filename, int i)
FILE* f = fopen(filename, "wb");
if (f == NULL)
return false;
fprintf(f, "%d", i);
fclose(f);
return true;
int main(void)
FILE* f = fopen("file.txt", "w");
if (f == NULL)
return NULL;
write_integer(f, 48);
fclose(f);
return 0;
【问题讨论】:
你为什么要首先将文件传递给该函数? 您不能将“FILE*”类型的“f”传递给函数 write_integer。只需传递 char 数组类型的文件名。此外,您要重新打开文件两次。 可以将函数改为write_integer(FILE* f, int i)
,不要在函数内再次调用fopen
。
所以int main(void) write_integer("file.txt", 48); return 0;
将完成这项工作。
是的,您可以在 C 中传递指针。您在 C 中并不完全具有“按引用传递”。目前尚不清楚该练习在教什么。也许练习是关于学习extern
和传递指针。
【参考方案1】:
这很奇怪...您可以将 write_integer
的参数更改为 FILE *。或传递函数的文件名。
而当文件以wb
模式打开时,只能写入二进制值。因此,无论您发送什么值,都将转换为二进制并写入。
【讨论】:
用"wb"
打开文件时可以写文字
写入二进制流的值不会自动转换为二进制。文本流和二进制流之间的区别在于,在文本流中,可以在 I/O 期间添加、更改或删除字符,以适应主机表示文本的约定。最常见的例子是更改行尾指示。这不会改变printf
或fwrite
调用本身的行为;他们仍然将相同的字符发送到流中;二进制流没有添加“转换为二进制”。字符的修改在流软件内部处理。
是的。谢谢你的澄清。在这里,他正在传递 int,所以我说转换。否则,对于其他类型(如字符串或字符)没有直接转换。以上是关于如何通过引用将文件传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章
如果 Swift 通过值而不是引用传递,为啥我可以通过将 UIView 传递给函数来在 Swift 中操作 UIView 的属性? [复制]