| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1207 人关注过本帖
标题:文本文件不能在VC++中正确执行吗?
取消只看楼主 加入收藏
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
结帖率:100%
收藏
已结贴  问题点数:15 回复次数:11 
文本文件不能在VC++中正确执行吗?
我在学习文件操作,下面这段代码是将一个文本文件的内容追加到另一个文本文件中去。
可以正确编译,可以运行。但得不到正确的运行结果文件,目标文件显示乱码,程序也无法显示。
请大家帮我看看,是什么问题?

程序代码:
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"

int main(void)
{
    char filetarget[40],fileappend[40];
    FILE * ft, * fa;
    char ch;

    printf("Enter the target file: ");
    gets(filetarget);
    if ((ft=fopen(filetarget,"a+"))==NULL)
    {
        printf("Can't open file \"%s\".",filetarget);
        exit(1);
    }

    printf("\nEnter the append file: ");
    while(gets(fileappend) && fileappend[0]!='\0')
    {
        if ((fa=fopen(fileappend,"r"))==NULL)
        {
            printf("Can't open file \"%s\".",fileappend);
            exit(1);
        }
        while((ch=getc(fa))!=EOF);
            putc(ch,ft);
        fclose(fa);
        printf("\nAppend next file(Empty line to quit): ");
    }

    puts("\nShow the target file: ");
    rewind(ft);   
    while((ch=getc(ft))!=EOF)
        putchar(ch);
    fclose(ft);
   
    //end
    while(getchar()!='\n');
    return 0;
}
搜索更多相关主题的帖子: 目标 文本文件 
2011-12-26 16:16
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
我又测试了一下,手动输入也不能进到文件里面去。如以下代码无效:
    if ((ft=fopen(filetarget,"a"))==NULL)
    {
        printf("Can't open file \"%s\".",filetarget);
        exit(1);
    }
    while((ch=getchar())!=EOF)
        putc(ch,ft);

但是我并上述几行代码放到一个函数中区,将函数名字符串作为参数,有效。
觉得很奇怪
2011-12-26 16:31
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
以下是引用vandychan在2011-12-26 16:24:54的发言:

文件名称呢
文件名称是通过gets函数输入的,这样不允许吗???
2011-12-26 16:32
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
以下是引用edward_eric在2011-12-26 16:50:22的发言:

咳,你也知道是在用文件,怎么用getc和putc呢?还有,文件打开模式哪有a 的?
文件单字符的输入输出不是用getc/putc的吗?如果是标准输入输出我记得是getchar/putchar
文件打开模式不是r(只读),w(覆写),a(追加)三种吗?
我看的书上是这样写的《C primer plus》,而且我前面写了几个程序都是有效的,放在函数中去实现也是有效的。

更奇怪的是:
键盘录入文件,现在有效了,我对比了一下代码,没有出入。
但我隐约觉得好像和文件本身有关。我是xp系统,vs2008
2011-12-26 17:10
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
怎么没有人解答?

[ 本帖最后由 yeliming 于 2011-12-26 17:19 编辑 ]
2011-12-26 17:15
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
Tony你好,

我记得你上次帮了我一个忙,这次能说的详细点吗?
2011-12-26 17:22
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
谢谢楼上的几位,尤其是Tony兄,真是一个热心的人,帮了我很多大忙!
2011-12-27 10:47
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
以下是引用TonyDeng在2011-12-26 17:56:04的发言:

"a+"模式很有关系,EOF未必存在于这种文件中,乱码在后面是不是?写到最后确定要终结时,记得补写一个EOF符号上去,确保安全,除非你不用EOF来检测文件结束。带+更新标志的文件读写,告一段落最好刷新一下缓冲区,比如你追加完一个文件,就强制写盘一次,到最后要显示ft,既然不想关闭文件再打开,就更要刷新一次缓存。这些保险措施,多写上去不会坏的,因为你未必知道那些库函数到底有做什么、没做什么,自己打保险好过依赖库函数的细节,要么你去仔细查过库函数参考手册这些函数的具体操作。

另外,你这种在循环中读文件名又检测打开是否失败的手段,最好戒了。你自己看,在后面的循环中,打开源文件失败exit()中断程序,原先打开了的ft没关闭被退出程序,那么那些数据会怎样?

写程序时,每一步都确保成功措施、调试过真的没问题,再进入下一步代码的编写。多个文件追加到同一个文件末尾,这样一气写下去,不如写一个关闭一个,反复打开和关闭,一个成功是一个,胜于半途某个不成功导致前功尽弃。你现在这样,到底哪出问题,最终还是要隔离各个步骤来排查,有什么区别呢。
个人总结:
1.“a+”模式确定是有EOF的,二进制模式没有这个符号。但是VC好像不认识CNTL_Z,怎么办?
2. 手动加EOF标志和更新缓冲,这两个个习惯我还真的一直没有,需要好好学习。
3. 好像尽量不要中途用exit退出,是不是有这个意思
4. while后面加分号,我都已经错误成习惯了,哎,这种错误还很难发现。
5. EOF不算char,之前学过的,但后面就忘了前面。
2011-12-27 11:58
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
关于EOF,以我现在入门的水平,我觉得你讲的有点深奥。
我测试了一下,在我的系统上,如果我在最后putc一个EOF的话,会多出一个乱码出来。
而且在我目前的系统上,用“a+”是能正确的在后面添加内容的,也就是说追加的时候能覆盖原来最后的EOF。

我现在还没学到系统编程,也还没有做一个具体的项目,不过我觉得你讲的还是对的,如果真的做项目的话,约定一定会比潜规则好!

还发现一点,在我的系统上,以二进制模式打开,也是能够识别EOF的。

关于可移植性,以后再慢慢学吧,呵呵!

[ 本帖最后由 yeliming 于 2011-12-27 13:56 编辑 ]
2011-12-27 13:49
yeliming
Rank: 2
等 级:论坛游民
帖 子:23
专家分:23
注 册:2011-12-9
收藏
得分:0 
Tony兄,你真是很好啊!我刚说话你就能马上回复。

我用记事本直接打开txt文件,看到一个乱码。用C去显示,看不到这个乱码,但会看到一个空格。
2011-12-27 13:59
快速回复:文本文件不能在VC++中正确执行吗?
数据加载中...
 
   



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

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