从c中的文件中读取多行(不同的长度)

时间:2015-07-09 05:39:56

标签: c arrays file file-io

我想将文件的以下内容加载到数组中。 文件内容:

[1,2,3,4,5]
[2,3]
[2]
[1,4,5,6,8,9]

现在,我想将第一行加载到整数数组'a' ( a ={1,2,3,4,5})并执行一些操作。免费的采取下一行并加载到'a' (a = {2,3})并执行一些操作等等..直到文件结束。

注意:每行可以有不同的数字。(我们不知道每行中的数字数量)

如何扫描每一行,只取数字并将它们存储在一个数组中? 我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/stat.h>
#include <fcntl.h>

#define DELIM " \r\n\t!@#$%^&*()_+-={}|\\:\"'?¿/.,<>’¡º×÷‘"

int main(int argc, char *argv[]){
    int lineIdx = 0;
    int charIdx = 0;
    int TERMINATOR = 1753775;
    char *token = "tmp";
    char *orLine = malloc(4096 * sizeof(char));
    char **importedLine = malloc(4096 * sizeof(orLine));
    int tokenizedArray[100][100];// = malloc(sizeof(orLine * numOfLines));

    FILE *f = fopen(argv[1], "r");

    while(fscanf(f, "%s", orLine) != EOF){
        importedLine[lineIdx] = orLine;
        for(charIdx = 0; charIdx < strlen(importedLine[lineIdx]); charIdx++){
            importedLine[lineIdx][charIdx] = importedLine[(lineIdx)][(charIdx+1)];
        }
        importedLine[lineIdx][(strlen(importedLine[lineIdx])-1)] = NULL;
        token = strtok(importedLine[lineIdx], ", ");
        charIdx = 0;
        while(token != NULL){
            tokenizedArray[lineIdx][charIdx] = atoi(token);
            token = strtok(NULL, ", ");
            charIdx++;
        }
        tokenizedArray[lineIdx][(charIdx)] = TERMINATOR;
        lineIdx++;
    }
    tokenizedArray[(lineIdx)][0] = TERMINATOR;
    fclose(f);
    lineIdx = 0;
    charIdx = 0;
    while(tokenizedArray[lineIdx][charIdx] != TERMINATOR){
        while(tokenizedArray[lineIdx][charIdx] != TERMINATOR){
            printf("%d ",tokenizedArray[lineIdx][charIdx]);
            charIdx++;
        }
        lineIdx++;
        charIdx = 0;
        printf("\n");
    }
    return 0;
}

提前致谢

4 个答案:

答案 0 :(得分:0)

请按照以下步骤操作:

  1. 阅读完整的一行
  2. 检查您的语法是否正确:行必须以[开头,以]
  3. 结尾
  4. 删除这些方括号
  5. ,处的分割线。现在你知道元素的数量了
  6. 分配此长度的数组
  7. 将所有子字段解析为整数

答案 1 :(得分:0)

大致

1首先在阅读模式下打开文件FILE*p;p=fopen("file.txt","r");

2取任何char数组说

char acline[40];int i;

3现在逐行使用循环读取文件内容并将它们存储到acline

while (!feof(p)) {for(i=0;i<40;i++)acline[i]=NULL;fgets(acline,40,p);// your code , whole line is in your array , insert if condition to check []}

4关闭文件fclose(p);

使用while(!feof(p))时会有一些问题!

答案 2 :(得分:0)

一个。使用一个int temporary_array[BIG_ENOUGH];

B中。使用两个整数变量int num;int i=0;,一个整数指针int *a

℃。打开文件

d。阅读每个角色。对于每个角色,请执行以下操作:

  1. 如果角色的ascii代码是数字的代码,则执行num = whatEverThatNumberIs;。然后执行temporary_array [i] =num; i++;

  2. 当你得到\n时,你就有了一行。执行a = malloc(i*sizeof (int));然后将每个元素从temporary_array [ ]复制到a [ ]。然后执行i=0;

    现在你有你的阵营a [i]。在此阵列中执行要执行的操作。

  3. free (a);

  4. 执行此操作直到您到达文件末尾。我想这是你可以做到的一种方式。

答案 3 :(得分:0)

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

typedef int Type;

typedef struct vector {
    size_t size;
    size_t capacity;
    Type *array;
} Vector;

Vector *vec_make(void){
    Vector *v = malloc(sizeof(*v));
    if(v){
        v->size = 0;
        v->capacity=16;
        v->array = malloc(v->capacity * sizeof(Type));
    }
    return v;
}

void vec_free(Vector *v){
    free(v->array);
    free(v);
}

void vec_add(Vector *v, Type value){
    v->array[v->size++] = value;
    if(v->size == v->capacity){
        Type *temp;
        temp = realloc(v->array, sizeof(Type)*(v->capacity += 16));
        if(!temp){
            perror("realloc at vec_add");
            vec_free(v);
            exit(-1);
        }
        v->array = temp;
    }
}

int main(int argc, char *argv[]){
    if(argc != 2){
        fprintf(stderr, "Usage : %s filename\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    FILE *f = fopen(argv[1], "r");
    if(f == NULL){
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    char line[4096];
    while(fgets(line, sizeof line, f)){
        static const char *delimiter = "[,] \t\n";
        Vector *v = vec_make();

        char *number = strtok(line, delimiter);//Format don't check
        for(; number; number = strtok(NULL, delimiter)){
            vec_add(v, atoi(number));
        }
        //some operation : print out
        int size = v->size;
        int *a = v->array;
        for(int i = 0; i < size; ++i){
            if(i)
                putchar(',');
            printf("%d", a[i]);
        }
        putchar('\n');
        vec_free(v);
    }
    fclose(f);
    return 0;
}