如何在C

时间:2019-03-19 23:48:56

标签: c file-io

我正在使用C语言的CPU Scheduler模拟器进行工作,并且有一个包含以下内容的输入文件:

1 0 10
2 0 9
3 3 5
4 7 4
5 10 6
6 10 7

我想按以下方式将数字分别存储在数组的第一,第二和第三列中:

a1[0] = 1     a2[0] = 0     a3[0] = 10
a1[1] = 2     a2[1] = 0     a3[1] = 9
a1[2] = 3     a2[2] = 3     a3[2] = 5
a1[3] = 4     a2[3] = 7     a3[3] = 4
a1[4] = 5     a2[4] = 10    a3[4] = 6
a1[5] = 6     a2[5] = 10    a3[5] = 7  

我无法理解如何通过C实现来实现这一点。我当前的代码如下:

int pList[len], wtList[len], btList[len];

char *str[256];
char *token[30];

FILE *input;

input = fopen(argv[1], "r");

if (input == NULL) {
    printf("File not found. \n");
    exit(1);
}

while (fgets(str, sizeof str, input)) {
    if (sscanf(str, "%d %d %d", &pList, &wtList, &btList) == 3) { 
        totalJobs++;
    } else {
        printf("Input text is not in 3 column format. Please check. \n");
    }
}

fclose(input);

//printf("Scheduling algorithm: %s\n", argv[2]);
//printf("Total %d tasks are read from \"%s\". press 'enter' to start...\n", totalJobs, input);
//printf("==================================================================\n");
for (i = 0; i < 6; i++) {
    printf(pList[i]);
    printf(wtList[i]);
    printf(btList[i]);
}

理想情况下,我希望将这些数字放入数组的抽象实现,因为输入文件应能够具有更多或更少的行,并且仍然可以工作。对于使用Stack Overflow的新功能,如果格式化不正确,我深表歉意。预先感谢您的帮助,如果我的问题仍然不清楚,请告诉我。

更新1:我按照说明进行了以下更正,现在出现Segmentation fault (Core dumped)错误。可能是因为我在数组前面没有*吗?

1 个答案:

答案 0 :(得分:0)

您的代码有很多问题。

1)您的数组未初始化,这是获取无法读取的输出和潜在的非常严重的错误的肯定方法。

2)代码中未声明多个变量。将来,请按原样发布适合您的代码,以便立即进行编译。一种没有得到任何答案的尝试而真实的方法是发布甚至在编译之前就需要进行大量编辑的代码:人们通常只是“拧这个,不值得”,而您真的不能责怪他们。 / p>

3)从性能方面来说,读取文件的方式效率低下。读取文件的最佳方法是一次性读取文件,然后解析它们以从文件中获取所需信息。

4)您在最后一个for循环中的printfs完全错误,这很奇怪,因为在上面注释掉的printfs和sscanf中,您似乎了解格式字符串的工作方式。我认为这是不仔细阅读您的代码的错误。请从现在开始。

这是一个完整的程序,我认为它大致可以满足您的要求:

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

int main(int argc, char** argv) {
    #define jobArrayLength (6ULL)
    #define stringLength   (256ULL)
    int  pList[jobArrayLength] = {0}, wtList[jobArrayLength] = {0}, btList[jobArrayLength] = {0};
    int  totalJobs = 0; // Used to not be declared
    char str[stringLength] = {0} ; // Used to be uninitialized

    FILE *input;
    input = fopen(argv[1], "r"); 
    if (input == NULL) {
        printf("File not found. \n");
        exit(1);
    }

    fread(str, 1, stringLength, input); // Used to be sizeof str which is wrong
    fclose(input);
    int i; // Used to not be declared
    int stringIndex = 0;
    for (i = 0; i < jobArrayLength; i++) {
        if (sscanf(str + stringIndex, "%d %d %d", pList + i, wtList + i, btList + i) == 3) { // used to not index into the array
            totalJobs++;
            while (str[stringIndex++] != '\n' && stringIndex != stringLength) {} // Skip to next row of numbers
        } else {
            printf("Input text is not in 3 column format. Please check. \n");
        }
    }

    //printf("Scheduling algorithm: %s\n", argv[2]);
    //printf("Total %d tasks are read from \"%s\". press 'enter' to start...\n", totalJobs, input);
    //printf("==================================================================\n");
    for (i = 0; i < jobArrayLength; i++) {
        printf("%d, %d, %d\n", pList[i], wtList[i], btList[i]); // Used to just print an int array element, which is not how printf works.
    }
    getchar();
    return 0;
}