当前位置: 首页 > 知识库问答 >
问题:

使用fscanf将固定长度的int扫描到数组中

唐麒
2023-03-14

如何使用fscanf(或处理文本文件中的stdins的任何其他函数)扫描具有相同长度的特定整数组,并将其放入相同数组中,但同时忽略比所需长度短的整数

以下是txt文件的外观:

63001234 1 1 -1 - - 0 1 1 1 - - 0
63001230 1 1 1 1 1 1 1 1 1 1 1 1
63001432 -1 -1 - - - - - - - - - -
63000176 - - 1 0 0 1 0 0 1 1 1 1

我需要存储63。。。一个整数数组中的数字以及另一个字符数组中的“1”、“1”、“0”和“-”。

这是现在我的扫描和测试功能于一体

int main() {

    printf("insert the name of the txt file you want to scan from: ");
    char fileopen [100];
    scanf("%s", fileopen);

    int Students [250];
    char Grades [250] [12];

    FILE *fop = fopen(fileopen ,"r");
    if(fop == NULL){
        printf("Error");
        EXIT_FAILURE;
    }
    int counter = 0;

    //read file
    while(1){
        if(fscanf(fop,"%d",&Students[counter]) == EOF){
            break;
        }
        for(int j = 0; j < 12; j++){
            fscanf(fop," %c",&Grades[counter][j]);
        }
        fscanf(fop,"\n");
        counter++;

    }

    counter = 0;
    //test what has been written in the arrays 
    while(counter <= strlen(Students)){

       printf("%d", Students[counter]);
       for(int j = 0; j < 12; j++){
            printf(" %c", Grades[counter][j]);
        }
        counter++;
        printf("\n");
    }

}

共有1个答案

冯宪
2023-03-14

您可以直接读取int和chars,而不是使用数字检查:

// You can use dynamic memory allocation here instead, or an appropriate max size.
// I used 100 because this is a template.
int numbers[100];
int chars[100][12];

char* line = (char*)malloc(100);

int i = 0;
while (true)
{
    /* Read line into buffer */
    if ((fgets(line, 100, file) == NULL) || ferror(file) || feof(file))
    {
        break;
    }

    /* Skip empty lines */
    if (strcmp(line, "\n") != 0)
    {
        continue;
    }

    /* Scan the integer */
    if (i == 0) {
        sscanf(line, "%d", &numbers[0]);
    } else {
        sscanf(line, "\n%d", &numbers[i]);
    }

    /* Scan the 12 characters */
    for (unsigned int j = 0; j < 12; ++j)
    {
        sscanf(line, " %c", &chars[i][j]);
    }

    i++;
}
 类似资料:
  • 我是Java新手,在过去从未遇到过麻烦的事情上苦苦挣扎。不管出于什么原因,我不能扫描代码中的int(或double),但我可以扫描字符串。我正在发布扫描程序无法正常工作的代码片段,请告诉我是否应该包含程序的其余部分。 在底部附近,不接受任何扫描值。我试着把它放在一个不同于的方法中,我试着重新排列它,为它创建一个单独的扫描仪,以及其他一些事情。调试器显示,不管怎样,我都会被卡在那行代码上。我做错了什

  • 我试图构建一个通过扫描仪构建的整数ArrayList。用户必须输入5到10个整数才能使ArrayList有效,但在运行程序时,实际输入数将是未知的。 如何构建程序,使其只在用户输入5、6、7、8、9或10个整数时运行?

  • 问题内容: 假设我得到一个介于1到127之间的随机数。我将该数字更改为二进制,并使用下面的代码将其从中删除: 现在,我想通过在必要时以零填充开头来使其长度为7个字符。我认为我需要使用一个for循环,但是有人可以告诉我该怎么做吗? 问题答案: 不,你不会。

  • 我想为这个代码寻求一些帮助。我没有问题读取一个文件本身和使用它作为扫描仪。我可以很容易地数出文件的双倍数。作为一个例子,这些是txt文件的前五个double。(这些数字应该是垂直列出的,但我几乎不怀疑这会有所不同) 这段代码总体上只是打印0.0的“num”数量,而不是将实际数字本身相加。请帮忙,谢谢。

  • 我听说,等数据类型的大小可能因平台而异。 我的第一个问题是:有人能举个例子,当程序假设一个是4字节,但在不同的平台上是2字节时,出了什么问题? 我的另一个问题与此有关。我知道人们用一些来解决这个问题,比如你有,,-这些变量保证是8位、16位、32位的,不管平台是什么——我的问题是,这通常是如何实现的?(我不是指library中的类型-我很好奇,怎么能强制某些类型总是说32位而不考虑平台??)

  • 问题内容: 例如,我们可以像这样构造一个数组: 我看到了这样的构造,但是我不明白为什么这可能有用。 问题答案: 一个例子。说,你有一个功能 获取一些文件名。想象一下,您找不到满足条件的文件名。你还回来什么?您有2个选择- 返回null 或 0大小的array 。 大小 为 0的数组 的变体更好,因为您的调用方不需要检查 NULL, 并且可以以一致的方式处理该数组-例如,在循环中(在这种情况下为空)