【问题标题】:How do I read into an array from a CSV file? [duplicate]如何从 CSV 文件读入数组? [复制]
【发布时间】:2016-10-01 04:52:46
【问题描述】:

我的 csv 文件包含以下内容:

            BP  BCS DEB EG  GY  KAP KEC MI
BP          0   216 511 311 22  23  242 550
Bekescsaba  216 0   23  34  11  345 23  42
Debrecen    511 642 0   124 31  124 123 315
Eger        311 1351 31 0   342 532 211 134
Gyor        22  135 341 431 0   134 23  312
Kaposvar    23  14  24  341 14  0   15  32
Kecskemet   242 241 241 135 14  15  0   231
Miskolc     550 24  4   12  352 124 123 0

IMG

我想将数字读入一个数组。问题是,我怎样才能做到这一点,同时也跳过第一个字符串?

这是读取所有内容的代码:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <math.h>
#include <time.h>
#define MAX 1024

void main() {

    FILE *f;
    float r;
    int i, j;
    char line[1024];
    char city[MAX];
    int mtx[20][20];
    int szam[50];
    char *cities[9] = {"Budapest", "Bekescsaba", "Debrecen", "Eger", "Gyor", "Kaposvar", "Kecskemet", "Miskolc"};
    f = fopen("/home/dumika/Desktop/asd.csv", "r");
    if(!f) printf("File opening problem!");


    //fgets(line, 1024, f);

    while(fscanf(f, "%s", city) != EOF)
    {
        printf("%s \n", city);
    }

}

关于如何在 C 上实际管理 csv i/o 的信息很少。实际任务是要求用户输入两个城市,并计算距离。 我要做的是读取矩阵中的数字,并在指针数组中包含城市。用户写入,例如布达佩斯(索引 0)和埃格尔(索引 3),距离将为 311。(mtx[0][3]) 但我无法将数字读入二维数组。最好的方法是什么?

【问题讨论】:

  • 但是文件不是逗号分隔的?
  • 将事物读取为字符串,split them,它们使用函数将数字转换为整数或双精度数
  • 旁白:请改进您的错误捕获:printf("File opening problem!"); 在出现段错误之前可能不会出现在控制台上。在消息末尾添加\n,并在main 中添加return 1
  • 问为什么凯奇凯梅特到米什科尔茨的距离是231,而米什科尔茨到凯奇凯梅特的距离是123,我是不是很挑剔?数据中还有许多其他此类异常。同样如评论所述,它不是 CSV 文件。如果是这样,它可以处理多个单词的城市名称,但现在它不能。也许它是一个 TSV(制表符分隔值)文件。

标签: c


【解决方案1】:

(旁注:CSV 表示 comma-separated values;您的文件不是 CSV 格式)

如果您知道数组的维度,并且不需要错误检查,则可以使用fscanf

以下将跳过一个单词(以空格分隔)。使用它来跳过您实际需要的数字之前的冗余名称。

fscanf(file, "%*s");

下面会读一个数字:

int distance;
fscanf(file, "%d", &distance);

将这些组合成一个循环,并进行适当的计数,您将获得数据。


注意:以上是一个快速而肮脏的解决方案。您在您的文件或读取它的代码中出现错误,fscanf makes it hard to handle errors。您应该学习如何在 C 中使用 fgetssplit a string

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 2015-06-26
    • 2018-11-07
    • 2015-11-10
    • 2019-02-19
    • 1970-01-01
    • 2021-10-23
    • 2017-06-07
    相关资源
    最近更新 更多