创建数组以保存1000000个数字

时间:2014-12-12 11:23:29

标签: c arrays

我在C中编写了一个代码,用于将带有数字的文本文件读入内存,并创建一个2d int数组来存储它们。

该文件具有以下格式:

9
9 5 6 2235 45558 6 5544 56565 2

第一个数字是数组的大小,第二个数字包含的数字与第一行的数字相同。 我的问题是阵列的大小不能超过~30,000个数字。如何制作以下代码,以便我可以使数组保持到1.000.000数字?我知道我应该使用一些长整数之王,但我无法做到。

继承代码

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


int is_end(char* input) {
    return *input == 0;
}

int is_separator(char* input) {
    return  *input == '\n' || *input == ' ';
}

char* eat_separators(char* input) {
    while (is_separator(input))
        ++input;

    return input;
}

size_t count_lines(char* input) {

    size_t rows = 1;                


     while (!is_end(input)) {       
         if (is_separator(input)) { 
            ++rows;                 
            input = eat_separators(input);  
        }
        else {
            ++input;                
        }


    }
    return rows;
}

char** get_lines(char* input, size_t number_of_rows) {

    char* from = input;
    size_t length = 0;
    size_t line = 0;
    size_t i;
     char** lines = (char**)malloc(number_of_rows * sizeof(char*));

    do {
        if (is_end(input) || is_separator(input)) {
            lines[line] = (char*)malloc(length + 1);
            for (i = 0; i < length; ++i)

                lines[line][i] = *(from + i);

            lines[line][length] = 0;
            length = 0;
            ++line;
            input = eat_separators(input);
            from = input;

        }
        else { 
            ++length;
            ++input;
        }
    } while (!is_end(input));

    /* 
        lines[line] = (char*)malloc(length + 1);
        for (i = 0; i < length; ++i)
            lines[line][i] = *(from + i);

        lines[line][length] = 0;
        ++line; */


    return lines;
}

int main(int argc, char* argv[]) {

    char** lines;           
    size_t size;            
    size_t number_of_rows;
    int count;              
    int* children;          


    FILE *input, *output;   
    char *contents;         
    int fileSize = 0;       
        int i;


    input = fopen("xxx.in", "r");





    long int filepos = 0L;
    fseek(input, 0L, SEEK_END);
    fileSize = ftell(input);
    fseek(input, 0L, SEEK_SET);

    contents = (char*)malloc(fileSize + 1);


    size = fread(contents, 1, fileSize, input);
    contents[size] = 0; 
    fclose(input);  


    number_of_rows = count_lines(contents);


    lines = get_lines(contents, number_of_rows);

    if ((count = atoi(lines[0])) <= 0 || count > 1000000){
            return 1;
    }



    children = (int*)malloc(count * sizeof(int));

    for (i = 0; i < count; ++i) {

         if ((children[i] = atoi(lines[i + 1])) <= 0 ) 
            return(-1);
        }
             // a check to see if everything stored in the array
            for(i = 0;i<count;i++)
            {
                    printf(" %d : %d\n", i, children[i]);
            }

    free(children);
    free(lines);



    // This is the end! Oh my dear friend, the end!
    return 0;
    }

1 个答案:

答案 0 :(得分:0)

首先让我解释一下只有30.000号码会回答你的问题的原因吗?

基本上您正在尝试将字符转换为ASCII值。我们以ASCII值为120的字符x为例。您将字符x更改为120,x的存储容量为1字节,但存储容量为120是3字节。所以,基本上你必须做的内存分配比实际值高3倍,因为1个字节扩展到3个字节。

在你的代码中增加内存分配3次,然后你的问题就会解决。