首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用fread和fread

正确使用fread和fread
EN

Stack Overflow用户
提问于 2017-04-11 14:21:43
回答 2查看 2.3K关注 0票数 1

我写了一个程序

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp;
    int r;
    char arr[] = "this is the string";
    char str[20] = {'\0'};

    fp = fopen("fwrite.txt", "w");
    fwrite(arr, 1, sizeof(arr), fp);
    fseek(fp, SEEK_SET, 0);
    r = fread(str, 1, sizeof(arr), fp);

    if(r == sizeof(arr))
        printf("read successfully\n");
    else
    {
        printf("read unsuccessfull\n");
        exit(1);
    }

    printf("read = %d\n", r);
    printf("%s\n", str);

    fclose(fp);
    return 0;
}

我正试着用这种方式阅读,但我做不到。这里的问题是,我应该放置&str[i]并为fread运行一个循环,还是fread能够将数据放入str

我得到的垃圾,我不明白为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-11 14:44:27

主要的问题是,您有向后fseek()的参数--在whence (SEEK_SET)之前需要偏移量(0)。第二个问题是,您试图从只为写入打开的文件中读取。在这种情况下,一个更小的问题,但一个通常非常重要的问题是,您不会错误地检查fopen()调用。(相对来说,这个fopen()失败的可能性不大,但人们已经知道了更有趣的事情。)您还应该检查fwrite()调用(当然,您已经检查了fread() )。

解决所有这些问题可能会导致:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int rc = EXIT_SUCCESS;
    int r;
    const char file[] = "fwrite.txt";
    char arr[] = "this is the string";
    char str[20] = {'\0'};
    FILE *fp = fopen(file, "w+b");
    if (fp == 0)
    {
        fprintf(stderr, "Failed to open file %s for reading and writing\n", file);
        rc = EXIT_FAILURE;
    }
    else
    {
        if (fwrite(arr, 1, sizeof(arr), fp) != sizeof(arr))
        {
            fprintf(stderr, "Failed to write to file %s\n", file);
            rc = EXIT_FAILURE;
        }
        else
        {
            fseek(fp, 0, SEEK_SET);
            r = fread(str, 1, sizeof(arr), fp);
            if (r == sizeof(arr))
            {
                printf("read successful\n");
                printf("read = %d bytes\n", r);
                printf("read data [%s]\n", str);
            }
            else
            {
                printf("read unsuccessful\n");
                rc = EXIT_FAILURE;
            }
        }
        fclose(fp);
    }
    return rc;
}

示例运行:

代码语言:javascript
复制
$ ./fi37
read successful
read = 19 bytes
read data [this is the string]
$

请注意,这在一定程度上是因为您将输出字符串末尾的空字节写入文件,然后将其读取回文件。如果该文件包含空字节,则该文件实际上不是文本文件。在二进制文件和文本文件之间没有区别的Unix系统上并不真正需要处于"w+b"模式的"w+b"。如果要向Windows上的文件写入空字节,则应使用b指示二进制模式。

如果您选择这样做,您可以通过在return函数中没有一个main()来减少‘繁忙’(或嵌套的深度)。您可以使用return EXIT_FAILURE;并避免使用else和另一组大括号。如果文件已打开,所显示的代码将小心关闭。在通用函数中,这很重要。在main()中,它并不那么重要,因为退出的过程无论如何都会刷新和关闭打开的文件。

票数 3
EN

Stack Overflow用户

发布于 2017-04-11 14:45:31

不能在文件中使用"w"模式读取fopen,而是使用"w+"

"r" -打开一个文件进行读取。文件必须存在。

"w" -创建一个用于写入的空文件。如果同名文件已经存在,则其内容被擦除,并且该文件被视为一个新的空文件。

"a" -附加到文件中。写入操作,在文件末尾追加数据。如果文件不存在,则创建该文件。

"r+" -打开一个文件来更新读写。文件必须存在。

"w+" --为读写创建一个空文件。

"a+" -打开一个用于读取和附加的文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43348672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档