| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1158 人关注过本帖
标题:打开文件的问题
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 10楼 TonyDeng
看了你的讲解我又去弄了下。
图片附件: 游客没有浏览图片的权限,请 登录注册
9528是我手动建立的新文件,9527是程序生成的,里面的内容是一串字符,后来我打开后又修改了下,和9527里的内容一样。下面是我打开文件的程序。
#include <stdio.h>
#include <stdlib.h>
 
int  main(void)
{
    FILE * fp;
    int i, n;
    char a[10], b[100];

    printf("Please input a filename:");
    scanf("%s", a);  // 输入要读的文件名
    getchar();       // 吸收回车符
    if ((fp = fopen(a, "rt")) == NULL)
    {
        printf("can not open file\n");
        exit(0);
    }
    for (i = 0; b[i] != '#'; i++)
        fscanf(fp,"%c", &b[i]);   // 一个字符一个字符的读文件传给b字符数组,遇到#停止
        n = i - 1;                // 记录读取的个数
    for (i = 0; i <= n; i++)      // 显示出来
        printf("%c", b[i]);
    fclose(fp);
    return  0;
}
不管我用"r"还是"rt"都能打开9527而打不开9528.
输入d:\file\9527出现以下现象,后面一堆乱码。
图片附件: 游客没有浏览图片的权限,请 登录注册

输入d:\file\9528 则
图片附件: 游客没有浏览图片的权限,请 登录注册

还有如果
printf("%c", b[i]); 改成 fprintf(fp,"%c", b[i]); 则输入文件名后没任何反应。

为什么会这样,我读文件的程序错在哪里?

梅尚程荀
马谭杨奚







                                                       
2011-12-25 20:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
明顯是兩個不同格式的文件,看圖標就知道。9527是沒有擴展名的,是你在程序中寫了沒有擴展名。但9528是有擴展名的,它是9528.txt,是用記事本生成的,你輸入9528當然找不到這個文件了。另外,你讀到亂碼,是文件沒有那麽長你卻硬讀固定數目數據造成的,與數組越界是同一囘事。

[ 本帖最后由 TonyDeng 于 2011-12-25 20:56 编辑 ]

授人以渔,不授人以鱼。
2011-12-25 20:52
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 12楼 TonyDeng
哈哈 你咋这么厉害呐。
图片附件: 游客没有浏览图片的权限,请 登录注册

那为什么都有乱码,我都fclose(fp); 还有就是用fprintf();能显示吗。

梅尚程荀
马谭杨奚







                                                       
2011-12-25 21:00
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
另外,你讀到亂碼,是文件沒有那麽長你卻硬讀固定數目數據造成的,與數組越界是同一囘事。

那 for (i = 0; b[i] != '#'; i++)怎么改呢?

梅尚程荀
马谭杨奚







                                                       
2011-12-25 21:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
亂碼輸出是因爲你在屏幕上printf()時那個for循環,終結條件是死數n,實際讀入的數據沒有那麽多,100個字符後面是沒初始化的亂碼,你都print出來了。

授人以渔,不授人以鱼。
2011-12-25 21:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在讀到'#'的時候,把它改成'\0'賦給數組b,作爲字符串的終結符。輸出時循環條件取strlen()的值計算,或者遇'\0'結束,跟平時做的一樣。

授人以渔,不授人以鱼。
2011-12-25 21:06
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 16楼 TonyDeng
照您说的改了
  for (i = 0; ; i++)
    {
        fscanf(fp,"%c", &b[i]);   // 一个字符一个字符的读文件传给b字符数组,遇到#停止
        if (b[i] == '#')
        {    b[i] = '\0';  break; }

    }
           n = i - 1;        // 记录读取的个数
    for (i = 0; b[i] != '\0' ; i++)      // 显示出来
        printf("%c", b[i]);
 
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 有容就大 于 2011-12-25 21:26 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2011-12-25 21:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其實,你不把'#'改成'\0'也沒問題的,但要把'#'也抄給b,後面不用改。這也就是說,此時用'#'作爲字符串結束符,而不是以'\0'結束,一樣可以的,不照C語言的規定以'\0'作字符串終結符,完全沒有問題,讀書不要在這方面上太死。當然,改變了終結符規則,就不能再用strlen()、strcpy()之類庫函數了,因爲它們按'\0'作結束符來設計,但是,函數可以自己寫的。

如果你要非主流行事,讓人無法把握程序的邏輯,就這麽做,只要有這方面的需要即可。不用人家說字符串非要'\0'結束不可而不敢變通。

授人以渔,不授人以鱼。
2011-12-25 21:32
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 18楼 TonyDeng
恩, 受教了。

梅尚程荀
马谭杨奚







                                                       
2011-12-25 21:36
快速回复:打开文件的问题
数据加载中...
 
   



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

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