| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2019 人关注过本帖, 1 人收藏
标题:renkejun版主呢 进来瞧瞧
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏(1)
已结贴  问题点数:100 回复次数:7 
renkejun版主呢 进来瞧瞧
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct song_info
{
    int songnum;
    char songname[15];

 }SINFO,*pso;

void add(SINFO* pso,FILE* fp,int num)
{
    for(int i=0;i<num;i++)
    {
        printf("这是要添加的第%d首歌的信息: \n",i+1);
        printf("歌曲编号是:");
        scanf("%d",&pso[i].songnum);
        fflush(stdin);
        printf("歌曲名字是:");
        gets(pso[i].songname);
        fflush(stdin);
        fprintf(fp,"%6d%16s\n",pso[i].songnum,pso[i].songname);
        //fwrite(&pso[i],sizeof(SINFO),1,fp);  //用上句sprintf能够成功写入
                                               //而使用fwrite则无法成功写入
                                               //表现1、int类型未能转化成字符
                                               //    2、结尾没有换行回车符
    }
    fclose(fp);
    printf("歌曲添加成功!\n");
}


int main(void)
{
    FILE* fp;
    int num=0;
    fp=fopen("song.txt","a+");
    printf("请输入你要添加歌曲的数量:");
    scanf("%d",&num);
    fflush(stdin);
    SINFO* pso;
    pso=(SINFO*)malloc(sizeof(SINFO)*num);
    memset(pso,0,sizeof(SINFO)*num);
    add(pso,fp,num);
    return 0;
}
这是下面有一个网友提出来的问题  我把问题简化了
现在的问题是  fwrite应该怎么写才能成功写入呢  看网上示例代码 好像就是如此写 貌似没有问题  可实际问题很大啊
搜索更多相关主题的帖子: int num printf 歌曲 成功 
2017-05-14 10:32
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10610
专家分:43210
注 册:2014-5-20
收藏
得分:20 
文件读写模式最好能统一
文本文件用fscanf()、fprintf()。
非文本文件用fread()、fwrite()。
另,既然在add模块就关闭文件,那也在add模块打开文件好了。
2017-05-14 14:42
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:20 
回复 楼主 wp231957
未命名.zip (19.28 KB)


fwrite也能运行啊,当然如楼上说的,最好把打开文件也放在函数里面,或关闭文件放在函数外面。
2017-05-14 15:47
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:20 
刚下班到家就看到召唤。

[此贴子已经被作者于2017-5-14 18:43编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-14 18:03
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
fwrite()是操作二进制模式的函数,至于能不能用它来进入文本模式的写,我倒还真不清楚。

我觉得,用fwrite来操作文本模式打开的文件,应该是Unix上的做法。


果然,我测试了一下,写入的是二进制数据,人眼根本不可读。
我不清楚别人是怎么用这个函数写入人眼可读的文本数据的,唯一的解释我能找到的只有系统。

[此贴子已经被作者于2017-5-14 18:25编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-14 18:06
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
我重复了测试,用文本模式打开song.txt文件,利用fread()函数读取其中的内容,然后写出,再一次证明,就算是以文本模式打开的文件,用fwrite()函数依旧写入的是二进制数据。

你用一下代码测试下就知道了,我(几乎)没做改动,只是把不需要的部分注释掉了,在main()函数中增加了几行。



程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct song_info
{
    int songnum;
    char songname[15];

 }SINFO;

/*void add(SINFO* pso,FILE* fp,int num)
{
    for(int i=0;i<num;i++)
    {
        printf("这是要添加的第%d首歌的信息: \n",i+1);
        printf("歌曲编号是:");
        scanf("%d",&pso[i].songnum);
        fflush(stdin);
        printf("歌曲名字是:");
        gets(pso[i].songname);
        fflush(stdin);
        //fprintf(fp,"%6d%16s\n",pso[i].songnum,pso[i].songname);
        fwrite(&pso[i],sizeof(SINFO),1,fp);  //用上句sprintf能够成功写入
                                               //而使用fwrite则无法成功写入
                                               //表现1、int类型未能转化成字符
                                               //    2、结尾没有换行回车符
    }
    fclose(fp);
    printf("歌曲添加成功!\n");
}*/


int main(void)
{
    FILE* fp;
    int num=0;
    SINFO a;
    fp=fopen("song.txt","a+");
    rewind( fp );
    while( 1 == fread( &a, sizeof( SINFO ), 1, fp ) )
    printf( "%d %s\n",a.songnum, a.songname );

    


    /*printf("请输入你要添加歌曲的数量:");
    scanf("%d",&num);
    fflush(stdin);
    SINFO* pso;
    pso=(SINFO*)malloc(sizeof(SINFO)*num);
    memset(pso,0,sizeof(SINFO)*num);*/
    //add(pso,fp,num);
    return 0;
}




[此贴子已经被作者于2017-5-14 18:40编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-14 18:34
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:20 
强答!
感觉题主的疑问是:为什么用fwrite写入的文件,用记事本打开看不到所有数据。
感觉开始学文件时就没有类似疑问。fwrite写入的数据是数据在内存中的映像复制,也就是数据在内存中是什么,文件中写入的就是什么,也就是所谓二进制模式,如i=1;fwrite(fp,i,sizeof(int);这样实际在文件中写入的是01 00 00 00,试问“01、00”是能正常显示的asc码么?如果用fprintf(fp,"%d",i)则在文件中写入的是49,正是字符“1”的asc码,这时用记事本打开就看的到1了,fprintf函数隐含了数据到显示字符转换的功能。
文本数据不过是二进制模式的一个局部,fwrite方便操作所有类型文件,而fprintf则方便写入有意义的可显示字符,如果程序员思路清晰,其实可以互用,操作任何类型文件。
题主可参考:
https://bbs.bccn.net/thread-475246-1-1.html
我用二进制模式读写结构体
https://bbs.bccn.net/thread-476983-1-1.html
我又用文本模式(输入流)读身份证地址编码表。

[此贴子已经被作者于2017-5-14 20:42编辑过]

2017-05-14 20:37
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:20 
fwrite应该怎么写才能成功写入呢
fwrite返回错误了吗?没有错误就是成功。
可实际问题很大啊
“实际问题很大”是因为你用文本模式查看二进制文件,得到的结果当然跟你预想的不一样。

未佩好剑,转身便已是江湖
2017-05-14 22:04
快速回复:renkejun版主呢 进来瞧瞧
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019851 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved