【问题标题】:Fread_s to save specific word?Fread_s 保存特定的单词?
【发布时间】:2016-02-04 20:41:52
【问题描述】:

我必须完成这个练习: 我必须从一个通用文本文件中读取,因此组成: [Nameperson][space][age],我必须将姓名(char)和年龄(unsigned int)保存在一个结构中。

我的问题是: 不明白name和age怎么分,就是如果我用fread_s,就这样

fread_s(pp->name, 256, 1, 256, f);

程序将我保存为名称 es。

皮波 25iiiiiiiiiiiiiiiiiiiiiiiiiii...

我知道 fread_s 函数维护最后一个字母的位置,但我不知道如何利用它来发挥我的优势 . 这是我的代码

#include <stdio.h>
#include <string.h>

struct person{
    char name[256];
    unsigned int age;
};

void person_read(FILE *f, struct person* pp) {
    fread_s(pp->name, 256, 1, 256, f);
}

谢谢。

【问题讨论】:

    标签: c file fread


    【解决方案1】:

    你用错了函数,你需要fscanf()

    int
    person_read(FILE *file, struct person *person)
    {
        // Warning: if names contain spaces "%255s%d" will not work
        if (fscanf(file, "%255s%d", person->name, person->age) != 2)
        {
            fprintf(stderr, "warning: invalid read!\n");
            return -1;
        }
        return 0;
    }
    

    这样使用

    struct person person;
    if (person_read(file, &person) != 0)
        do_somethin_read_error();
    else
        fprintf(stderr, "%s has %d years\n", person.name, person.age);
    

    您的代码产生该输出的原因是因为您正在将文件中的所有字节(或只是 256)读入person-&gt;name,并且因为person-&gt;name 不是null 终止,将其传递给 printf() 会产生您看到的输出,并且是 *Undefined Behavior**。

    【讨论】:

    • 关于 fscanf Visual Studio 说'这个函数或变量可能不安全。考虑改用 fscanf_s。我该如何解决?
    • 这就是为什么我不喜欢面向学生的 Visual Studio,因为它试图强制执行非标准函数。我知道它会这么说,但我不为 MS 操作系统编写代码,所以我无法为您提供帮助。我想如果你在文件的开头添加#define _CRT_SECURE_NO_WARNINGS it should silence the warnings and you would be able to use standard functions
    • 你解决它的方式是“考虑使用fscanf_s”(而不是fscanf
    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多