Chinaunix

标题: 如何用C去读不定个数的数字?谢谢!! [打印本页]

作者: snoopyzhao    时间: 2004-01-11 22:40
标题: 如何用C去读不定个数的数字?谢谢!!
有几行数字(存在文件中,纯文本文件),每行的个数不定,中间以空格作间隔(空格个数不定),请问如何用C读出每行的数字,并将其赋值到一个数组中?

谢谢!!

B.T.W.初学,请多多关照……
作者: lenovo    时间: 2004-01-11 22:46
标题: 如何用C去读不定个数的数字?谢谢!!
什么叫每行的数字?
是字符个数?
作者: aero    时间: 2004-01-11 22:53
标题: 如何用C去读不定个数的数字?谢谢!!
不明白楼主每行的意思。
作者: lonemoon    时间: 2004-01-12 09:58
标题: 如何用C去读不定个数的数字?谢谢!!
你的意思是不是文件有多行?
每行都有很多十进制的数字?
想把他们读出来,并存到一个int类型的数组里?
是这个意思吗?(问题阐述的不清楚,小心遭来杀身之祸,呵呵)
作者: fieryfox    时间: 2004-01-12 10:27
标题: 如何用C去读不定个数的数字?谢谢!!
fgets之后用sscanf。
作者: pksun    时间: 2004-01-12 10:53
标题: 如何用C去读不定个数的数字?谢谢!!
[quote]原帖由 "fieryfox"]fgets之后用sscanf。[/quote 发表:

如果知道每行有多少个空格才能用sscanf吧?
我的办法是循环取每一个字符,付给一个字符串,遇到空格字符是,该字符串结束,然后atoi转换
作者: fieryfox    时间: 2004-01-12 11:20
标题: 如何用C去读不定个数的数字?谢谢!!
sscanf返回值是成功读取的数目。
作者: 蓝色键盘    时间: 2004-01-12 13:09
标题: 如何用C去读不定个数的数字?谢谢!!
fieryfox 说得对。不论中间有多少空格。sscanf都可以正确处理
作者: BingbingNorth    时间: 2004-01-12 13:13
标题: 如何用C去读不定个数的数字?谢谢!!
我写了一个只用fgetc()的实现。[Code]
#include <stdio.h>;

#define MAXLEN 10

static int ch;
static FILE * input_file;

/*初始化,成功返回1,失败返回0*/
int get_num_init(const char * file_name)
{
        input_file=fopen(file_name, "r");
        if(input_file==NULL)
                return 0;
        ch=fgetc(input_file);
        if(ch==EOF)
                return 0;
        else
                return 1;
}

/*从输入文件中取得一个数字,成功返回1,失败返回0,注意,失败有可能是读到非法字符,也可能是到达文件尾*/
int get_num(int * num)
{
        while((ch==' ')||(ch=='\t')||(ch=='\n'))
                ch=fgetc(input_file);
       
        if((ch<'0')||(ch>;'9'))
                return 0;
       
        *num=ch-'0';
       
        do
        {
                ch=fgetc(input_file);
                if((ch>;='0')&&(ch<='9'))
                        *num=*num*10+ch-'0';
        }while((ch>;='0')&&(ch<='9'));
       
        return 1;
}

int main(int argc, char ** argv)
{
        int values[MAXLEN];
        int values_len;
        int i;
       
       
        if(argc!=2)
        {
                printf("运行方式:%s 文件名\n",argv[0]);
                return 0;
        }
       
        if(!get_num_init(argv[1]))
        {
                printf("初始化失败\n");
                return 0;
        }
       
        for(values_len=0; (values_len<MAXLEN)&&get_num(values+values_len); values_len++);
       
       
        for(i=0; i<values_len; i++)
                printf("%d\n",values[i]);
}
[/Code]
作者: win_hate    时间: 2004-01-12 13:19
标题: 如何用C去读不定个数的数字?谢谢!!
[quote]原帖由 "BingbingNorth"][/quote 发表:


粘代码的时候, 不是  [Code], 而是  [code]
作者: BingbingNorth    时间: 2004-01-12 13:58
标题: 如何用C去读不定个数的数字?谢谢!!
谢谢win_hate,请允许我再试一次。
  1. #include <stdio.h>;

  2. #define MAXLEN 10

  3. static int ch;
  4. static FILE * input_file;

  5. /*初始化,成功返回1,失败返回0*/
  6. int get_num_init(const char * file_name)
  7. {
  8.         input_file=fopen(file_name, "r");
  9.         if(input_file==NULL)
  10.                 return 0;
  11.         ch=fgetc(input_file);
  12.         if(ch==EOF)
  13.                 return 0;
  14.         else
  15.                 return 1;
  16. }

  17. /*从输入文件中取得一个数字,成功返回1,失败返回0,注意,失败有可能是读到非法字符,也可能是到达文件尾*/
  18. int get_num(int * num)
  19. {
  20.         while((ch==' ')||(ch=='\t')||(ch=='\n'))
  21.                 ch=fgetc(input_file);
  22.        
  23.         if((ch<'0')||(ch>;'9'))
  24.                 return 0;
  25.        
  26.         *num=ch-'0';
  27.        
  28.         do
  29.         {
  30.                 ch=fgetc(input_file);
  31.                 if((ch>;='0')&&(ch<='9'))
  32.                         *num=*num*10+ch-'0';
  33.         }while((ch>;='0')&&(ch<='9'));
  34.        
  35.         return 1;
  36. }

  37. int main(int argc, char ** argv)
  38. {
  39.         int values[MAXLEN];
  40.         int values_len;
  41.         int i;
  42.        
  43.        
  44.         if(argc!=2)
  45.         {
  46.                 printf("运行方式:%s 文件名\n",argv[0]);
  47.                 return 0;
  48.         }
  49.        
  50.         if(!get_num_init(argv[1]))
  51.         {
  52.                 printf("初始化失败\n");
  53.                 return 0;
  54.         }
  55.        
  56.         for(values_len=0; (values_len<MAXLEN)&&get_num(values+values_len); values_len++);
  57.        
  58.        
  59.         for(i=0; i<values_len; i++)
  60.                 printf("%d\n",values[i]);
  61. }
复制代码

作者: snoopyzhao    时间: 2004-01-13 00:48
标题: 如何用C去读不定个数的数字?谢谢!!
原帖由 "lonemoon" 发表:
你的意思是不是文件有多行?
每行都有很多十进制的数字?
想把他们读出来,并存到一个int类型的数组里?
是这个意思吗?(问题阐述的不清楚,小心遭来杀身之祸,呵呵)


正是这个意思,一个文件有多行,每行有多个十进制的数字(正数、负数)。而且每行中的数字个数不完全相同,最多可以是8个,最少1个。因此,我不知道如何用sscanf来处理了……

由于没有阐述明白,让大家花心思去猜测,实在不好意思。
作者: snoopyzhao    时间: 2004-01-13 00:52
标题: 如何用C去读不定个数的数字?谢谢!!
谢谢BingbingNorth,我试试看。
作者: snoopyzhao    时间: 2004-01-13 00:57
标题: 如何用C去读不定个数的数字?谢谢!!
[quote]原帖由 "蓝色键盘"]fieryfox 说得对。不论中间有多少空格。sscanf都可以正确处理[/quote 发表:


如fieryfox兄说的那样,sscanf返回的是成功处理的个数,可是条件表达式如何写啊(因为每行的数字个数不等)?如何将每个数字赋到数组中去呢,是不是还是要象BingbingNorth兄说的那样去得理每个数字呢?还是有什么别的方法?

谢谢!!
作者: lenovo    时间: 2004-01-13 01:39
标题: 如何用C去读不定个数的数字?谢谢!!
原帖由 "snoopyzhao" 发表:


如fieryfox兄说的那样,sscanf返回的是成功处理的个数,可是条件表达式如何写啊(因为每行的数字个数不等)?如何将每个数字赋到数组中去呢,是不是还是要象BingbingNorth兄说的那样去得理每个数字呢?还是有什么..........

估计只能这样了,
读出一行,然后一个一个字符读取,
读到空格则前面的是一个数字,
读到'\n'表示一行结束。
作者: flw    时间: 2004-01-13 09:11
标题: 如何用C去读不定个数的数字?谢谢!!
用 scanf 是一个思路。
如果自己写,
推荐一个函数 ungetc()
作者: BingbingNorth    时间: 2004-01-13 09:39
标题: 如何用C去读不定个数的数字?谢谢!!
对不起,我上次考虑得太简单了,没有考虑符号位,以及0001这样的数字的合法性问题。
重新提交一次,没有用到ungetc。[code]#include <stdio.h>;

#define MAXLEN 10/*
作者: BingbingNorth    时间: 2004-01-13 09:40
标题: 如何用C去读不定个数的数字?谢谢!!
[code]#include <stdio.h>;

#define MAXLEN 10/*数组长度*/

static int ch;
static FILE * input_file;

/*-----------------------------------------------------------------------------
初始化函数
输入:要读的源文件名
返回值为逻辑型,成功返回1,失败返回0
------------------------------------------------------------------------------*/
int get_num_init(const char * file_name)
{
        input_file=fopen(file_name, "r");
        if(input_file==NULL)
                return 0;
        ch=fgetc(input_file);
        if(ch==EOF)
                return 0;
        else
                return 1;
}

/*-------------------------------------------------------------------------------
从输入文件中取得一个数字
返回值为逻辑型,成功返回1,失败返回0
注意,失败有可能是读到非法字符,也可能是格式不对(比如01),也可能是到达文件尾,
--------------------------------------------------------------------------------*/
int get_num(int * num)
{
        int sig=1;/*符号位*/

        while((ch==' ')||(ch=='\t')||(ch=='\n'))
                ch=fgetc(input_file);

        if((ch=='-')||(ch=='+'))/*如果输入带符号的话,必须紧跟数字,否则算错*/
        {
                if(ch=='-')
                        sig=-1;
                ch=fgetc(input_file);
        }

        if(ch=='0')/*首字符为0,后面不能再有数字字符*/
        {
                ch=fgetc(input_file);
                if((ch>;='0')||(ch<='9'))
                        return 0;
                else
                {
                        *num =0;
                        return 1;
                }
        }
        else
                if((ch>;='1')&&(ch<='9'))/*首字符为1-9*/
                {
                        *num=ch-'0';

                        l1:
                        ch=fgetc(input_file);
                        if((ch>;='0')&&(ch<='9'))
                        {
                                *num = *num * 10 + ch - '0';
                                goto l1;
                        }
                        else/*读到非数字结束,如果遇到像1a这样的输入,认为1是正确的数字*/
                        {
                                *num = *num * sig;
                                return 1;
                        }
                }/*首字符为非法字符或文件结束符*/
                else
                        return 0;
}

int main(int argc, char ** argv)
{
        int values[MAXLEN];
        int values_len;
        int i;


        if(argc!=2)
        {
                printf("运行方式:%s 文件名\n",argv[0]);
                return 0;
        }

        if(!get_num_init(argv[1]))
        {
                printf("初始化失败\n");
                return 0;
        }

        for(values_len=0; (values_len<MAXLEN)&&get_num(values+values_len); values_len++);


        for(i=0; i<values_len; i++)
                printf("%d\n",values[i]);
}[/code]
作者: snoopyzhao    时间: 2004-01-13 23:48
标题: 如何用C去读不定个数的数字?谢谢!!
谢谢BingbingNorth 兄及各位大虾的帮助!!
作者: ym    时间: 2004-01-14 12:25
标题: 如何用C去读不定个数的数字?谢谢!!
用awk吧,用awk就可以很容易的处理这样的问题阿~
作者: tinywind    时间: 2004-01-14 14:57
标题: 如何用C去读不定个数的数字?谢谢!!
lex
作者: BingbingNorth    时间: 2004-01-14 15:02
标题: 如何用C去读不定个数的数字?谢谢!!
其实我的程序就是根据词法分析方式写的,相应的正则表达式为0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*,不过手工写的程序比较短,也好看一些。
作者: dysnake    时间: 2004-01-14 15:35
标题: 如何用C去读不定个数的数字?谢谢!!
首先使用fread,配合ftell和fseek循环读出定量数据同时移动文件指针,其次将每次读出的数据使用strchr函数寻找相应的分割符,使用指针将每次取得的数据放在你的分配的空间中即可。不过你要对一些细节进行处理,例如一段数据超出了一次读的块,即前次读与后次读的关联性问题。这种方法比单字节读取减少了系统调用的时间,在时间上有一定的优势,但相应的程序要复杂一些。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2