笔画空间使用 buffer/dynamic 内存

Strok spaces using buffer/dynamic memory

我如何在从缓冲区读取数据时在空格处进行 strtok?如果我的文本文件包含

1 23 50

45 50 30

2 15 30

我决定用下面的代码打印数组,它将逐行打印。我如何扩展它以进一步将数组划分为数组的每个索引的单独数字?例如

1

23

50 等...

我试过使用 strtok,但一直出现段错误,我不确定在哪里修复它。

FILE * fp;
char buffer[5000];
int size = 0;
char **entireFile = NULL;
fp = fopen("file.txt","r");

entireFile = malloc(sizeof(buffer) * sizeof(char*));

while (fgets(buffer,5000,fp)!= NULL)
{
    entireFile[size] = malloc(strlen(buffer)+1);
    strcpy(entireFile[size],buffer);         
    size++;
}

I want entireFile[0] = 1, entireFile1 = 23

这可以使用 fscanf 轻松完成。 Here 是扫描输入的一个很好的参考。

#include <stdio.h>

int main(){

    FILE *in = fopen("in.txt" , "r");
    int hold;

    /* Won't actually store values, but can be used for
       value manipulation inbetween */

    while ( fscanf(in, "%d", &hold) != EOF ){
        printf("Scanned in %d\n", hold);
    }

    fclose(in);

    return 0;

}

如果您希望以数组形式使用它,请添加一个递增整数并将保留更改为数组。

#include <stdio.h>

int main(){

    FILE *in = fopen("in.txt" , "r");
    int hold[100], i=0; // Hold a maximum of 100 integers

        while ( fscanf(in, "%d", &hold[i]) != EOF ){
            printf("Scanned in %d\n", hold[i++]);
        }

        fclose(in);

    return 0;

}

你也可以像这样进行动态内存分配:

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

int main(){

    FILE *in = fopen("in.txt", "r");

    int i=0, j;
    char* fragments[2000];
    char entry[100];

    while ( fscanf(in, "%s", &entry[i]) != EOF ){
        fragments[i] = malloc(sizeof(char) * (1 + strlen(entry)));
        strcpy(fragments[i], &entry[i]);
        i++;
    }
    for ( j = 0; j < i; j++ ){
        printf("%s\n", fragments[j]);
    }

    fclose(in);

    return 0;

}

这将在文件的每一行读取 1、2 或 3 个数字。它使用 sscanf 中的 return 值来查看从每一行读取了多少数字。当然,如果有流氓非数值数据,那就乱了。

#include <stdio.h>

int main(void)
{
    FILE *fp;
    int a, b, c;
    int res;
    char str [100];
    if ((fp = fopen("file.txt", "rt")) == NULL)
        return 1;

    while(fgets(str, sizeof str, fp) != NULL) {
        res = sscanf(str, "%d%d%d", &a, &b, &c);
        if (res == 3)
            printf ("3 values %d %d %d\n", a, b, c);
        else if (res == 2)
            printf ("2 values %d %d\n", a, b);
        else if (res == 1)
            printf ("1 value %d\n", a);
        else
            printf ("0 values\n");
    }

    fclose(fp);
    return 0;
}

文件内容:

1 23 50
45 50 30
2 15 30
10 20

100

程序输出:

3 values 1 23 50
3 values 45 50 30
3 values 2 15 30
2 values 10 20
0 values
1 value 100