如何从文件中读取整数位数?

时间:2013-10-21 18:43:56

标签: c

我想阅读一个包含数十亿个数字的文本文件,我想将每个10位数字存储在一起,然后将下一个10位数一起计算,依此类推...... 例如 : 我的文件将包含123456789123456789123456789 我的前10位数字将是:1234567891 我的第二个数字将是:2345678912 等等 我知道下面的代码可以读取文件中的整数

#include<stdio.h>

    int main()
    {
            FILE *ptr_file;
            char buf[1000];

            ptr_file =fopen("num.txt","r");
            if (!ptr_file)
                return 1;

            while (fgets(buf,1000, ptr_file)!=NULL)
                printf("%s",buf);

        fclose(ptr_file);
            return 0;
    }

但每次如何读取10位数?

5 个答案:

答案 0 :(得分:1)

使用:

ptr_file =fopen("num.txt","rb");

while(fread(buf, 1, 10, ptr_file) != 10) {
}

但是,如果您需要快速执行此操作 - 我建议使用mmap()打开文件,并在mmapped缓冲区上使用快速自定义atou()。

答案 1 :(得分:1)

假设您不想将它们存储为整数,那么可以采用相同的方法,将buf中的10位数填充为C字符串(空终止)

while ( fgets(buf, 11, ptr_file) !=NULL )
   printf("%s\n",buf);

答案 2 :(得分:1)

由于所有数据块都是10字节,因此请务必一次读取10个字节 由于数据可能是&gt; = power(2,32),因此请使用unsigned long longuint64_t类型进行后续数值处理。

inf = fopen("num.txt", "rb");  // Open in binary
#define ChunkSize (10)
char buf[ChunkSize + 1];         // Extra for \0
buf[ChunkSize] = '\0';
int result;
while((result = fread(buf, ChunkSize, 1, inf)) == 1) {
  unsigned long long x;
  char *endptr;
  x = strtoull(buf, 10, &endptr);
  if (endptr != &buf[ChunkSize]) {
    break;  // Syntax error
  }
  // Do something with x or buf;
}
if (result == 0) {
  ; // handle I/O error
}

答案 3 :(得分:1)

#include<stdio.h>

int main()
{
        FILE *ptr_file;
        char buf[1000];
        char tendigits[11];

        ptr_file =fopen("num.txt","r");
        if (!ptr_file)
            return 1;

        while (fgets(buf,1000, ptr_file)!=NULL)
        {
            int counter = 0;
            do
            {
                 for(int loop=0;loop<10;loop++) tendigits[loop]=buf[counter+loop];
                 tendigits[10]='\0';
                 /*Process the tendigits string here*/
                 counter+=10;
            }while(counter<1000);
        }

    fclose(ptr_file);
    return 0;
}

当然,这只是一个例子。您必须考虑到该文件可能不是1000的倍数并进行相应调整。

编辑:如果您存储的数字包含'\ 0',那么缓冲区的大小必须是11的倍数,并调整我给出的11位数的示例,删除添加'\ 0'。< / p>

答案 4 :(得分:1)

       #include <stdio.h>
       #include<sys/types.h>
       #include<sys/unistd.h>
       #include <math.h>
       enum  //these are modes to open the file
       { 
           reading=0; 
           writing=1;
           readwrite=2;
       }
       int main()
       {
           unsigned long int a[10];
           int file_1,i=0,lim,pid,j,k=0,res;
           if((pid=fork())==0) //child process
           {
               file_1=open("Program_name",mode); //program name has to be the path
               if(file_1<0)
               {
                   exit(1);
               }
               else
               {
                   while(1)
                   {
                       i=0;
                       j=9;
                       res=0;
                       while(i<10)
                       {
                           lim=read(file_1,&ch,sizeof(char));
                           if(lim<=0)
                           {
                               exit(2);
                           }
                           dig=convert(&ch);
                           res=res+dig*pow(10,j); //code to make a 10 digit number
                           j--;
                       }
                       a[k]=res;
                       k++;
                   }  
               }
               close(file_1);
           } //child process ends here
           else //parent process begins here
           {
               /*code that use the digits above */
           }
           return 0;
       }
       int converter(char *p) //this function coverts char to integer
       { 
           int num;
           *p=*p-'0';
           num=(int)*p;
           return num;
       }