【问题标题】:Writing a struct into a file but reading it incorrectly将结构写入文件但读取不正确
【发布时间】:2021-04-04 12:51:42
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Student
{
    int id;
    int grade;
};

struct Student john;

int main()
{

    john.id = 100;
    john.grade = 80;

    struct Student steve;

    fwrite(&john, sizeof(struct Student), 1, stdout);
    fread(&steve, sizeof(struct Student), 1, stdout);

    printf("\n%d %d \n", steve.id, steve.grade);

    return 0;
}

我正在尝试将struct 写入文件(在本例中为标准输出),然后我正在尝试读取它。

它打印的值是随机的,可能是什么原因?

【问题讨论】:

  • 你知道stdout是终端或控制台的输出文件句柄吗?我建议您首先为所有可以返回成功/失败的函数添加错误检查,例如fwritefread
  • @Someprogrammerdude 是的,但这有什么不同吗?它们不都被视为文件吗?
  • 文件可以是只读、只写或读写。 stdout 是只写的。这基本上就是 fopen 的第二个参数的用途。
  • “随机”是什么意思?我希望写入能够成功写入值,但它们不会很好地显示在您的屏幕上。 fread 我预计会失败。
  • 或许可以这样想:stdoutconsoleterminal。您写入stdout 的数据实际存储在哪里?它只是写入控制台或终端。

标签: c struct io fwrite fread


【解决方案1】:

正如 cmets 中所述,您无法从 stdout 读取,但是您可以在可以打开以读取和写入的文件中执行此操作,您甚至可以替换 stdout 为这样的文件,例如在使用未命名管道的 UNIX 中,chek C language. Read from stdout

但是,您仍然需要在写入后重新定位文件偏移量,以便您可以从文件的开头读取,例如:

int main()
{

    john.id = 100;
    john.grade = 80;

    FILE* f = fopen("test", "w+"); // check return value..

    struct Student steve;

    fwrite(&john, sizeof(struct Student), 1, f); // same here...

    fseek(f, 0, SEEK_SET); // <-- reset offset, (or lseek if you're using a file descritor)

    fread(&steve, sizeof(struct Student), 1, f); // and here

    printf("\n%d %d \n", steve.id, steve.grade);

    fclose(f);

}

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多