如何通过引用将文件传递给函数?

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 期间添加、更改或删除字符,以适应主机表示文本的约定。最常见的例子是更改行尾指示。这不会改变printffwrite 调用本身的行为;他们仍然将相同的字符发送到流中;二进制流没有添加“转换为二进制”。字符的修改在流软件内部处理。 是的。谢谢你的澄清。在这里,他正在传递 int,所以我说转换。否则,对于其他类型(如字符串或字符)没有直接转换。

以上是关于如何通过引用将文件传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章

通过指针或引用将映射传递给函数?

Javascript 是不是通过引用或值将数组传递给函数?

通过值或常量引用传递给函数?

如何将对象或引用传递给函数?

如果 Swift 通过值而不是引用传递,为啥我可以通过将 UIView 传递给函数来在 Swift 中操作 UIView 的属性? [复制]

使用 std::optional 通过引用将 std::vector<int> 传递给函数