【问题标题】:How to identify a double \n\n with fgets/read/fread如何使用 fgets/read/fread 识别双重 \n\n
【发布时间】:2019-12-10 07:56:57
【问题描述】:

我有一个点文件,我需要使用 C 将其解析为图形结构。

我的 dot 文件包含 2 个块,用双 \n 分隔:

  • 一个是垂直的

  • 另一个是边

我已经尝试过使用 fgets,因为它会一直读取到 \n 为止。计算verticles的数量是有帮助的,但不是计算它之后的内容。我不知道我该怎么做

现在我有这样的功能(不完整)

int graphe_charger_dot(graphe *g, char *nom_fichier) {
  FILE * f;
  int n;
  if ((f = fopen(nom_fichier, "r")) == 0) {
    puts(nom_fichier);
    puts("Erreur d'ouverture du fichier");
    return -1;
  }

  char buffer[500];

  fgets(buffer, sizeof(buffer),f);
;
  if (strcmp(buffer, "graph {\n") != 0) {
    puts("Erreur de compatibilité de fichier");
    puts(nom_fichier);
    return -1;
  }
  puts("Fichier ouvert et compatible");
  puts("Lecture du buffer 1");

  // reads the first verticles. the atoi is just here to test if i can convert an char to integer even with a non integer right after it. 
  fgets(buffer, sizeof(buffer),f);
  n = atoi(buffer);
  g->n += 1;

  return 0;
}

我的点文件

graph {
  0;
  1;
  2;
  3;
  4;
  5;
  6;
  7;
  8;


  0 -- 1;
  0 -- 4;
  0 -- 5;
  0 -- 6;
  0 -- 8;
  1 -- 2;
  1 -- 3;
  1 -- 4;
  1 -- 5;
  2 -- 3;
  2 -- 4;
  2 -- 5;
  2 -- 8;
  3 -- 7;
  5 -- 7;
  5 -- 8;
  6 -- 8;
  7 -- 8;
}

以及图的结构

struct s_graphe {
  int n;                /* number of verticles */
  int m;                /* number of edges */
  int adj[GRAPHE_ORDRE_MAX][GRAPHE_ORDRE_MAX];
  /* Adjacency matrix of the graph */
};

【问题讨论】:

  • 如果fget() 返回一个等于"\n" 的字符串,那么你读取的是一个空行。
  • @Barmar 是正确的。另一种方法是getc,然后如果下一个字符不是另一个换行符,则使用ungetc 将其放回原处。

标签: c file graph buffer dot


【解决方案1】:

如何识别双重\n\n ...

前一行以'\n' 结尾。使用fgets(),测试buffer[0] == '\n' 是否以'\n' 开头和结尾以检测连续的'\n'

  ...
  puts("Lecture du buffer 1");

  //fgets(buffer, sizeof(buffer),f);
  //n = atoi(buffer);
  //g->n += 1;

  while (fgets(buffer, sizeof buffer, f) && buffer[0] != '\n') {
    // parse `buffer` for a vertex
  }

  while (fgets(buffer, sizeof buffer, f)) {
    // parse `buffer` for an edge
  }

我的 dot 文件包含 2 个用双 \n 分隔的块:

下面看起来像 3 '\n' 连续。 3 个中的第一个在 "8;\n" 行结束。

7;\n
8;\n
\n
\n
0 -- 1;\n
0 -- 4;\n

在这种情况下,需要做更多的工作。也许

  while (fgets(buffer, sizeof buffer, f) && buffer[0] != '\n') {
    // parse `buffer` for a vertex
  }

  // Here code consumes 0 or more lines that are only `"\n"`
  // Could use a counter to limit
  int ch;
  while ((c = fgetc(f)) == '\n');
  ungetc(ch, f);

  while (fgets(buffer, sizeof buffer, f)) {
    // parse `buffer` for an edge
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2016-04-05
    • 2016-08-20
    相关资源
    最近更新 更多