c语言-C语言标准库fwrite失败,代码已给出,求帮助。

问题描述

C语言标准库fwrite失败,代码已给出,求帮助。

代码:


#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

void main()
{
    FILE* fp = fopen("aaa.txt", "rb+");

    if (fp == NULL) {
        return;
    }

    if (_fseeki64(fp, 0, SEEK_END) != 0) {
        return;
    }

    long long size = _ftelli64(fp);

    if (size < 0) {
        return;
    }

    if (_fseeki64(fp, 0, SEEK_SET) != 0) {
        return;
    }

    char buf[1024];

    if (fread(buf, 20, 1, fp) != 1) {
        return;
    }

    if (fwrite("test", 5, 1, fp) != 1) {
        return;
    }

    fclose(fp);
}

aaa.txt的内容(刚好20个字节):

aaaaaaaaaaaaaaaaaaaa

vc2010和vc2015结果都一样,在fwrite那里出错。期望fwrite返回1,实际返回0。errno为0。

实在想不出原因,请教一下大家。多谢帮忙。

解决方案

好了终于找到原因了。参见资料:http://stackoverflow.com/questions/23843587/fwrite-doesnt-work-directly-after-fread
fread之后不能直接用fwrite,反过来也一样。必须先调用一次fseek才行,而且要注意fseek的_Origin这个参数要是SEEK_SET或者SEEK_END,不能用SEEK_CUR。
这么牛逼的设定,C标准库的文档中居然没有提到半个字,出错了得到的errno还是0。害我调了2个多小时。真是见鬼了。

解决方案二:

rb+需要文件存在,而且要有权限才能写入。

解决方案三:

回1楼:aaa.txt文件存在,可以用rb+的方式打开,有权限写入。我试过打开以后从头开始写就没问题,不管多少数据都可以写进去。但像这样读了20个字节,文件指针刚好指向末尾的时候,fwrite就会返回0。

解决方案四:

我在两台机器上测试都是这样,如果有疑问可以亲自编译一下试试。

时间: 2024-08-29 02:58:13

c语言-C语言标准库fwrite失败,代码已给出,求帮助。的相关文章

Win8系统中文语言里添加英文输入法失败怎么解决?

  Win8系统中文语言里添加英文输入法失败怎么解决?           1.首先,在桌面上单击鼠标右键,选择"新建"-->"文本文档";复制下面代码到其中; 2.将此txt文件另存为可操作注册表的reg文件,依次选择记事本菜单栏的"文件"-->"另存为",确定好保存位置,然后在选择最下面的"保存类型"为"所有文件",在上面"文件名"一项填入:中文语言下

c语言-关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点

问题描述 关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点 下面代码主要实现链表的创建,插入,删除,并且能将两个年龄递增链表进行合并成递减链表 然而在插入和删除操作中gets函数无法起作用,strcmp函数也出现位置冲突报错..功力不足实在解决不了..跪求大神解答..(感觉自己写的东西除了上面两个错误应该还有,但是因为位置冲突问题就只能编译到那个地方无法进行下去..我肉眼实在找不出来.. #include<stdio.h> #include<stdlib.h> #incl

探究C语言标准库limits.h关于INT_MIN宏的奇怪定义

最近在读<深入理解计算机系统>(顺便打个广告,卡内基梅隆出品的这本书绝对精品),在书的48页提到了在C语言标准库limits.h中将int类型的最小值INT_MIN定义为-INT_MAX-1.书中提到了为何不写做-2147483648或者0x80000000,但是并没有给出解释,只是说这需要我们钻研C语言标准的一些比较隐晦的角落. 我们先看看MSVC的相关头文件内容: GCC也给出了类似的定义方式: 为何是这样呢?这个头文件对我来说并不陌生.这几个宏也时常在用着,但是从没有注意过这个细节问题.

C语言的静态库与共享库

1库的概念 2静态库 2-1 静态库的概念 2-2 静态库的创建 2-2-1 静态库创建的命令 2-2-2 静态库创建的准备工作 2-2-3 创建静态库的例子 2-3 静态库的使用 2-3-1 静态库使用的命令 2-3-2 静态库使用的例子 3共享库动态链接库 3-1 共享库的概念 3-2 共享库的创建 3-2-1 共享库的创建命令 3-2-2 共享库的创建例子 3-3 共享库的使用 3-3-1 共享库的使用命令 3-3-2 共享库的使用例子 4不使用库的方法 1.库的概念 函数库是由系统建立的

atl com c++ ocx-c++调用自己编写的ocx库文件失败原因

问题描述 c++调用自己编写的ocx库文件失败原因 #include #include #include "../last/LAST.h" #include "../last/LAST_i.c" void main(void) { // 声明一个HRESULT变量以及一个Simple_ATL接口的指针 IMyClass *IMyClass = NULL; HRESULT hr = CoInitialize(NULL); // 初始化COM // 现在初始化COM h

Adata 1.1 发布,多语言的序列化库

Adata 1.1发布,调整lua的模块实现,大幅提升性能 http://git.oschina.net/lordoffox/adata AData是一个多语言的序列化库,和protocol buffer类似. 目前支持C++/Lua(5.1,5.2,5.3,jit)/C#,非常适合游戏的通讯协议和数据存储 Adata的优势,生成的代码量少,和protocol buffer比较代码量大幅减少,可读性强 功能上,除了protocol buffer支持的向前兼容,增加了向后兼容的支持 C++版特性,

《R的极客理想—工具篇》—— 2.1 R语言时间序列基础库zoo

2.1 R语言时间序列基础库zoo 问题 R语言怎么处理时间序列数据? 引言 时间序列分析是一种动态数据处理的统计方法,通过对时间序列数据的分析,我们可以感觉到世界正改变着什么!R语言作为统计分析的利器,对时间序列处理有着强大的支持.在R语言中,单独为时间序列数据定义了一种数据类型zoo,zoo是时间序列的基础,也是股票分析的基础.本节将介绍zoo库在R语言中的结构和使用. 2.1.1 zoo包介绍 zoo是一个R语言类库,zoo类库中定义了一个名为zoo的S3类型对象,用于描述规则的和不规则的

go语言日志记录库简单使用方法实例分析_Golang

本文实例讲述了go语言日志记录库简单使用方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (  "fmt"  "log"  "os" ) func main(){  logfile,err := os.OpenFile("/var/golang/jb51.net.log",os.O_RDWR|os.O_CREATE,0);  if err!=nil {   fmt.P

网站开发中, php所扮演的角色,以及与其他语言,工具或库的关系,这个问题很重要

问题描述 网站开发中, php所扮演的角色,以及与其他语言,工具或库的关系,这个问题很重要 网站开发中, php所扮演的角色,以及与其他语言,工具或库的关系,这个问题很重要 解决方案 php是一种web脚本语言,它主要用来编写应用层.web应用层需要iis或者apache这样的web服务器去执行.只使用php其实也可以开发一个完整的服务器端程序了.如果你希望一部分业务放在客户端执行,那么需要用js脚本.如果你希望调用一些别的语言的库,或者出于性能的优化,可以用C++写dll,用php模块加载.