| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1110 人关注过本帖
标题:简单的字符排序程序,不知到怎样让它结束输入
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那就是你说的那样了。你执行一下看,最后一行有没有丢失,一行文字打到中间给它一个EOF。

授人以渔,不授人以鱼。
2012-07-27 14:24
LShang
Rank: 4
来 自:China
等 级:业余侠客
威 望:3
帖 子:183
专家分:258
注 册:2010-12-24
收藏
得分:0 
回复 21楼 TonyDeng
唔 一行代码中间有EOF的话,EOF后边的就全都舍弃了,不过这个也算是意料之中啦
请教下T版,为啥我在TC下测试程序就没问题,VC测试中间夹一个EOF就有BUG呢?
在行尾或中间输入EOF,文本可以被读进去,只有在行首输入EOF才会识别退出。
这是为啥呢?fgets的实现不一样?

学如逆水行舟,不进则退
士不可以不弘毅,任重而道远
2012-07-27 14:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这个我曾经做过测试,不过结论忘记了,好像读之前要先检测feof()的,用feof()或ferror()来控制循环,而不是用返回值为EOF来控制,后者不可靠的。

授人以渔,不授人以鱼。
2012-07-27 14:45
LShang
Rank: 4
来 自:China
等 级:业余侠客
威 望:3
帖 子:183
专家分:258
注 册:2010-12-24
收藏
得分:0 
回复 23楼 TonyDeng
唔 原来是这样,对这几个函数不太熟,找找资料,我也做下测试吧,嘿嘿 谢谢T版哦

学如逆水行舟,不进则退
士不可以不弘毅,任重而道远
2012-07-27 14:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
测试fgets()的找不到了,有个下面的,使用fgetc()。

程序代码:
/*----------------------------
程序说明: 将指定文本文件按行分割为若干份
使用格式: test_File <文件名> /n:<分割数>
----------------------------*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
    if (argc < 3)
    {
        printf_s("格式: %s <filename> /n:<n>\n", argv[0]);
        return -1;
    }

    int number = 0;                // 分割文件数
    sscanf_s(strchr(argv[2], ':') + 1, "%d", &number);
    if (number == 0)
    {
        printf_s("参数%s格式不正确\n", argv[2]);
        return -2;
    }
    FILE** out;
    out = new FILE*[number];
    if (!out)
    {
        printf_s("内存分配失败\n");
        return -3;
    }

    // 打开输入文件
    FILE* in;
    errno_t error = fopen_s(&in, argv[1], "rb");
    if (error != 0)
    {
        printf_s("文件%s打开错误\n", argv[1]);
        return error;
    }

    // 建立输出文件
    for (int index = 0; index < number; ++index)
    {
        char buffer[5];            // 假定分割数不超过4位数
        _itoa_s(number, buffer, sizeof(buffer), 10);
        size_t length = strlen(argv[1]) + _countof(buffer);
        char* filename = new char[length];
        if (filename)
        {
            sprintf_s(filename, length, "%s.%d", argv[1], index + 1);
            errno_t error = fopen_s(&out[index], filename, "wb");
            if (error != 0)
            {
                printf_s("文件%s建立错误\n", filename);
                return error;
            }
            delete[] filename;
        }
    }

    // 分割文件操作
    // 机制:若是文本文件,每行必定以0D0A结束,则遇到0A才递增行号
    size_t line_no = 0;            // 行号
    while (!feof(in))
    {
        if (fputc(fgetc(in), out[line_no % number]) == 0x0A)
        {
            ++line_no;
        }
    }

    // 关闭打开的文件
    for (int index = 0; index < number; ++index)
    {
        fclose(out[index]);
    }
    delete[] out;
    fclose(in);

    printf_s("文件%s分割完成\n", argv[1]);

    return 0;
}

还有一个是这样的:
程序代码:
        while (!feof(file))
        {
            char buffer[1024];
            if (fgets(buffer, sizeof(buffer) - 1, file) != NULL)
            {
                struct RECORD record;
                char* pStart = strchr(buffer, '\"') + 1;
                char* pEnd = strrchr(buffer, '\"');
                strncpy_s(record.name, pStart, pEnd - pStart);
                record.name[pStart, pEnd - pStart] = '\0';
                if (sscanf_s(pEnd + 1, "%d %d %d", &record.integral, &record.goal_difference, &record.goals) < 3)
                {
                    error = -1;
                    printf_s("数据文件记录错误: Line %d\n", theRecords.size() + 1);
                    break;
                }
                theRecords.push_back(record);
            }
        }
读的数据如下:
程序代码:
"China" 2 1 5
"U.S.A." 12 2 7
"U.K." 12 4 10
"Japan" 4 2 3
"France" 4 2 4
"Germany" 10 3 8

最后一行是没有回车的,能读入。

[ 本帖最后由 TonyDeng 于 2012-7-27 15:08 编辑 ]

授人以渔,不授人以鱼。
2012-07-27 15:00
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 22楼 LShang
vc 的 ctrl-z 就是需要单独成行才行。在行中的 ctrl-z 就直接识别成 ctrl-z 了,ascii 码为 26 的字符,不是 EOF。
ctrl-z 是终端用于输入 EOF 的手法,它读到单独成行的 ctrl-z 后,向库函数提示 EOF。感觉和库函数可能没有什么直接关系。
如果 TC 不是这个行为,可能是它弹出的那个黑乎乎的东西是它自己实现的。
2012-07-28 09:47
快速回复:简单的字符排序程序,不知到怎样让它结束输入
数据加载中...
 
   



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

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