| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3304 人关注过本帖
标题:文件读写错误!
只看楼主 加入收藏
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
文件读写错误!
程序代码:
/*
有两个磁盘文件“A”和“B”,各存放一行字母,今要求把这两个文件中的信息
合并(按字母顺序排列),输出到一个新文件“C”中去。
*/
/*
思路:
1、建立两个可读写文件file1、file2,将str1、str2字符串分别读入到file1,file2;
2、将file1,file2中的字符串写入到str3,在str3中对字符串进行排序;
3、将str3字符串按字符依次写入到file3并输出。
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
void main()
{
    FILE *fp1,*fp2,*fp3;
    char str1[20],str2[20],str3[40],temp;
    unsigned int i,j;
    if((fp1=fopen("file1.txt","w"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    if((fp2=fopen("file2.txt","w"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    if((fp3=fopen("file3.txt","w"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    fclose(fp1);
    fclose(fp2);
    printf("input string1:");
    gets(str1);
    printf("input string2:");
    gets(str2);
    fputs(str1,fp1); //将str1字符串写入到fp1;
    fputs(str2,fp2); //将str2字符串写入到fp2;
    //以上测试正常,fp1,fp2已被写入数据

    fp1=fopen("D:\\VC\\第十章-文件\\file1.txt","r");
    fp2=fopen("D:\\VC\\第十章-文件\\file2.txt","r");
    fgets(str3,strlen(str1),fp1);//将fp1的字符串读入到str3;
    fgets(str3,strlen(str2),fp2);//将fp2的字符串读入到str3;

    /*以下测试str3是否读取到数据*/
    puts(str3);
    getchar();
    /*测试错误:烫烫烫+str2字符串,str3未成功读取数据。对"fp1/fp2"进行rewind也没用*/


    /*对str3字符串排序*/
    for(i=0;i<strlen(str1)+strlen(str2);i++)
        for(j=i+1;j<strlen(str1)+strlen(str2);j++)
            if(str3[i]>str3[j])
            {
                temp=str3[i];
                str3[i]=str3[j];
                str3[j]=temp;
            }


      /*将str3字符串写入到fp3*/
    for(i=0;i<strlen(str1)+strlen(str2);i++)
    {
        fputc(str3[i],fp3);
        putchar(str3[i]);
    }
}

//目前主要问题是str3未读取到数据。


[ 本帖最后由 a4811 于 2013-1-8 16:22 编辑 ]
搜索更多相关主题的帖子: 字符串 字母 
2013-01-08 14:50
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:20 
程序代码:
 fputs(str1,fp1); //将str1字符串写入到fp1;
    fputs(str2,fp2); //将str2字符串写入到fp2;
    //以上正常
    fgets(str3,strlen(str1)*(sizeof(char)),fp1);//将fp1的字符串读入到str3;
    fgets(str3,strlen(str2)*(sizeof(char)),fp2);//将fp2的字符串读入到str3;
兄弟,文件指针啊,别扔了

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-08 15:05
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 2楼 yaobao
fp1/fp2不是文件指针吗?
还请bao哥细说。
2013-01-08 15:10
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
句柄是句柄,文件指针是文件指针,两码事的,你在网上找找,或者老谭的书的351页

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-08 15:16
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 4楼 yaobao
    fp1=fopen("D:\\VC\\第十章-文件\\file1.txt","w+");
    fp2=fopen("D:\\VC\\第十章-文件\\file2.txt","w+");
    fgets(str3,strlen(str1),fp1);//将fp1的字符串读入到str3;
    fgets(str3,strlen(str2),fp2);//将fp2的字符串读入到str3;
你的意思是不是要这样。
我真搞不懂哪里错了,bao哥,你就直接指出撒,怎么改,哪里有错。
fp1、fp2在上面已经定义了是文件指针,还要怎么说它不是文件指针。
2013-01-08 15:52
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
用fopen打开的文件会有一根文件指针,他不是句柄,当你用读写打开时他指在文件开头,以追加打开它指在结尾,每读入或读出一个字符文件指针向后移一位。
你试试将文件关闭再打开进行读写,或者用fseek将文件指针放回起始位置试试,后面的内容我没看。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-08 15:58
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
程序代码:
/*
有两个磁盘文件“A”和“B”,各存放一行字母,今要求把这两个文件中的信息
合并(按字母顺序排列),输出到一个新文件“C”中去。
*/
/*
思路:
1、建立三个可读写文件file1、file2,file3,将str1、str2字符串分别读入到file1,file2;
2、将file1,file2中的字符串写入到str3,在str3中对字符串进行排序;
3、将str3字符串按字符依次写入到file3并输出。
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
void main()
{
    FILE *fp1,*fp2,*fp3;
    char str1[20],str2[20],str3[40],temp;
    unsigned int i,j;
    if((fp1=fopen("E:\\file1.txt","w+"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    if((fp2=fopen("E:\\file2.txt","w+"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    if((fp3=fopen("E:\\file3.txt","w+"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    printf("input string1:");
    gets(str1);
    printf("input string2:");
    gets(str2);
    fputs(str1,fp1); //将str1字符串写入到fp1;
    fputs(str2,fp2); //将str2字符串写入到fp2;
    //以上正常
    fseek(fp1,0,0);
    fseek(fp2,0,0);
    fgets(str3,strlen(str1)+1,fp1);//将fp1的字符串读入到str3;
    fgets(str3+strlen(str1),strlen(str2)+1,fp2);//将fp2的字符串读入到str3;
    /*
    puts(str3); //错误
    getchar();
    */
    for(i=0;i<strlen(str1)+strlen(str2);i++)//对str3字符串排序
        for(j=i+1;j<strlen(str1)+strlen(str2);j++)
            if(str3[i]>str3[j])
            {
                temp=str3[i];
                str3[i]=str3[j];
                str3[j]=temp;
            }
      /*将str3字符串写入到fp3*/
    for(i=0;i<strlen(str1)+strlen(str2);i++)
    {
        fputc(str3[i],fp3);
        putchar(str3[i]);
    }
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
}

这样应该差不多了

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-08 16:49
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 7楼 yaobao
嗯,用rewind函数也可以。
但当我在前面建立的是只写文件时,只有输入两个等长的字符串运行才正确,不等长就错误。这是啥原因?
程序代码:
/*
有两个磁盘文件“A”和“B”,各存放一行字母,今要求把这两个文件中的信息
合并(按字母顺序排列),输出到一个新文件“C”中去。
*/
/*
思路:
1、建立三个文件file1、file2、file3,将str1、str2字符串分别写入到file1,file2;
2、将file1,file2中的字符串读入到str3,在str3中对字符串进行排序;
3、将str3字符串按字符依次写入到file3并输出。
*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
void main()
{
    FILE *fp1,*fp2,*fp3;
    char str1[20],str2[20],str3[40],temp;
    unsigned int i,j;
    if((fp1=fopen("file1.txt","w"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    if((fp2=fopen("file2.txt","w"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    if((fp3=fopen("file3.txt","w"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    printf("input string1:");
    gets(str1);
    printf("input string2:");
    gets(str2);
    fputs(str1,fp1); //将str1字符串写入到fp1;
    fputs(str2,fp2); //将str2字符串写入到fp2;
    //以上测试正常,fp1,fp2已被写入数据
    fclose(fp1);
    fclose(fp2);
    fp1=fopen("file1.txt","r");
    fp2=fopen("file2.txt","r");
    rewind(fp1);
    rewind(fp2);
    fgets(str3,strlen(str1)+1,fp1);             //将fp1的字符串读入到str3;
    fgets(str3+strlen(str2),strlen(str2)+1,fp2);//将fp2的字符串读入到str3;
    /*以下测试是否写入str3、*/
    puts(str3);
    getchar();
    /*测试错误:当输入的两个字符串等长时运行正确,输入不等长字符串运行错误*/

    /*对str3字符串排序*/
    for(i=0;i<strlen(str1)+strlen(str2);i++)
        for(j=i+1;j<strlen(str1)+strlen(str2);j++)
            if(str3[i]>str3[j])
            {
                temp=str3[i];
                str3[i]=str3[j];
                str3[j]=temp;
            }
      /*将str3字符串写入到fp3*/
    for(i=0;i<strlen(str1)+strlen(str2);i++)
    {
        fputc(str3[i],fp3);
        putchar(str3[i]);
    }
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    printf("\n");
}
/*
最前面建立的是只写文件,不是可读写文件。
问题:
当输入的两个字符串等长时运行正确,输入不等长字符串运行错误。
*/



2013-01-08 20:40
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
你啊,知道要rewind要fseek却不知道为什么,什么时候要rewind,fseek;知道要fgets(str3+strlen(str2),strlen(str2)+1,fp2);却不知道为什么要这样。
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
void main()
{
    FILE *fp1,*fp2,*fp3;
    char str1[20],str2[20],str3[40],temp;
    unsigned int i,j;
    if((fp1=fopen("file1.txt","w"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    if((fp2=fopen("file2.txt","w"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    if((fp3=fopen("file3.txt","w"))==NULL)
    {
        printf("Can not find the file!\n");
        getchar();
        exit(0);
    }
    printf("input string1:");
    gets(str1);
    printf("input string2:");
    gets(str2);
    fputs(str1,fp1); //将str1字符串写入到fp1;
    fputs(str2,fp2); //将str2字符串写入到fp2;
    //以上测试正常,fp1,fp2已被写入数据
    fclose(fp1);
    fclose(fp2);
    fp1=fopen("file1.txt","r");
    fp2=fopen("file2.txt","r");
    rewind(fp1);
    rewind(fp2);//这里杀掉不要
    fgets(str3,strlen(str1)+1,fp1);  //这里是str1           //将fp1的字符串读入到str3;
    fgets(str3+strlen(str1),strlen(str2)+1,fp2);//将fp2的字符串读入到str3;
    /*以下测试是否写入str3、*/
    puts(str3);
    getchar();
    /*测试错误:当输入的两个字符串等长时运行正确,输入不等长字符串运行错误*/

    /*对str3字符串排序*/
    for(i=0;i<strlen(str1)+strlen(str2);i++)
        for(j=i+1;j<strlen(str1)+strlen(str2);j++)
            if(str3[i]>str3[j])
            {
                temp=str3[i];
                str3[i]=str3[j];
                str3[j]=temp;
            }
      /*将str3字符串写入到fp3*/
    for(i=0;i<strlen(str1)+strlen(str2);i++)
    {
        fputc(str3[i],fp3);
        putchar(str3[i]);
    }
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    printf("\n");
}

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2013-01-08 21:22
a4811
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:107
注 册:2012-12-20
收藏
得分:0 
回复 9楼 yaobao
懂了,bao哥。rewind和fseek,是改变文件位置标记。
在关闭文件之后,再打开它,文件位置标记已在开头,无需改变;若没关闭,文件位置标记在末尾,需用rewind和fseek函数改变它。
至于那个strlen1写成strlen2纯属粗心。
2013-01-08 22:21
快速回复:文件读写错误!
数据加载中...
 
   



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

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