c - 从 C 文本文件中读取逗号分隔的数字(坐标)

标签 c file

我正在尝试从包含 1000 行数字的文本文件中读取 C 语言中的一些数字,例如:

-340,495,-153,-910,835,-947  
-175,41,-421,-714,574,-645  
-547,712,-352,579,951,-786  
419,-864,-83,650,-399,171  
...

但是当我执行代码时,我看到i变量从901开始,而不是0,所以它从点i=901i=999。这就是我遇到问题的地方。

我尝试使用 while 循环而不是 for 循环来避免额外的 i 变量:

while(!feof(file_in)){
    fscanf(file_in,"%d%*c%d%*c",&a[0],&a[1]);
    fscanf(file_in,"%d%*c%d%*c",&b[0],&b[1]);
    fscanf(file_in,"%d%*c%d%*c",&c[0],&c[1]);
    printf("A(%d,%d) I=%d\n",a[0],a[1],i);
    printf("B(%d,%d) I=%d\n",b[0],b[1],i);
    printf("C(%d,%d) I=%d\n",c[0],c[1],i);  
}

这是我遇到困难的代码部分:

int main(void) {
    FILE *file_in;

    int a[2];
    int b[2];
    int c[2];

    file_in = fopen("triangles.txt","r");

    if (file_in == NULL){
        printf("Can't open file for reading.\n");
        exit(0);
    }
    else{
        for(int i=0;i<1000; i++) {
            fscanf(file_in,"%d%*c%d%*c",&a[0],&a[1]);
            fscanf(file_in,"%d%*c%d%*c",&b[0],&b[1]);
            fscanf(file_in,"%d%*c%d\n",&c[0],&c[1]);
            printf("A(%d,%d) I=%d\n",a[0],a[1],i);
            printf("B(%d,%d) I=%d\n",b[0],b[1],i);
            printf("C(%d,%d) I=%d\n",c[0],c[1],i);  
        }
       fclose(file_in);
    }
    return 0;
}

我的期望:

A(-340,495) I=0  
B(-153,-910) I=0  
C(835,-947) I=0  
A(-175,41) I=1  
...

我得到了什么:

B(-225,-818) I=901  
C(-808,-657) I=901  
A(-279,-34) I=902  
B(-533,-871) I=902  
...

最佳答案

我认为您还没有证明这个问题。这是对代码的细微调整,向 stderr 报告错误、出现错误时退出等等。

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

int main(void)
{
    int a[2];
    int b[2];
    int c[2];
    const char filename[] = "triangles.txt";
    FILE *file_in = fopen(filename, "r");

    if (file_in == NULL)
    {
        fprintf(stderr, "Can't open file %s for reading.\n", filename);
        exit(EXIT_FAILURE);
    }

    for (int i = 0; i < 1000; i++)
    {
        int r1 = fscanf(file_in, "%d%*c%d%*c", &a[0], &a[1]);
        int r2 = fscanf(file_in, "%d%*c%d%*c", &b[0], &b[1]);
        int r3 = fscanf(file_in, "%d%*c%d\n", &c[0], &c[1]);
        if (r1 != 2 || r2 != 2 || r3 != 2)
        {
            fprintf(stderr, "Failed to read data for i = %d: r1 = %d, r2 = %d, r3 = %d\n",
                    i, r1, r2, r3);
            exit(EXIT_FAILURE);
        }
        printf("A(%4d,%4d) I=%d\n", a[0], a[1], i);
        printf("B(%4d,%4d) I=%d\n", b[0], b[1], i);
        printf("C(%4d,%4d) I=%d\n", c[0], c[1], i);
    }
    fclose(file_in);
    return 0;
}

请注意,它会仔细检查扫描操作,并在遇到问题时报告问题。

Beware of the trailing newline in the format string 。当输入来自文件时,这是可以的(不是必需的,但是可以),但是如果人们期望人类输入数字,那么这将是一场可怕的 UI 灾难。

给定数据文件:

-340,495,-153,-910,835,-947  
-175,41,-421,-714,574,-645  
-547,712,-352,579,951,-786  
419,-864,-83,650,-399,171

我得到输出:

A(-340, 495) I=0
B(-153,-910) I=0
C( 835,-947) I=0
A(-175,  41) I=1
B(-421,-714) I=1
C( 574,-645) I=1
A(-547, 712) I=2
B(-352, 579) I=2
C( 951,-786) I=2
A( 419,-864) I=3
B( -83, 650) I=3
C(-399, 171) I=3
Failed to read data for i = 4: r1 = -1, r2 = -1, r3 = -1

当然,最后一行出现在标准错误上;其余部分写在标准输出上。

因此,我认为您的问题不在所示的代码中。

关于c - 从 C 文本文件中读取逗号分隔的数字(坐标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55308647/

相关文章:

c - 使用系统和库函数对文件进行排序

c - 将指针分配给空指针时出现段错误

c++ - 解包/解密/提取/应用程序 .bin 文件

java - 当没有给出路径时,在java中将在哪里创建一个新文件?

c - 如何消除C语言中的警告?

c++ - 二维数组值 C++

c - 迭代插入二叉树

Java : running time of big file inputs

java - 如何让 Java HttpServer 处理文件上传的 Post 请求

C# 文件异常 : cannot access the file because it is being used by another process