c - 将文本文件中的行读取到字符串指针数组中。

标签 c string pointers

我逛遍了 Stack Exchange,但没有看到任何线程可以回答我的问题,但如果我错过了,请引导我找到一个线程。

我正在使用C。

所以我有一个文本文件,其中前九行是标签(带空格),之后的每一行都是与这些标签相对应的九段数据。我已经声明了一个指针数组:

char * cp_labels[9];

我正在尝试将文本文件中的前 9 行读取到数组的每个元素中。

文本文件如下所示:

Et jet 1
Et jet 2
Et jet 3
Eta 1
Eta 2
Eta 3
Met
Ht
Njet
(double) (double) (double) (double) (double) (double) (double) (double) (double)
(double) (double) (double) (double) (double) (double) (double) (double) (double)
(double) (double) (double) (double) (double) (double) (double) (double) (double)
...

等等。现在我只是想确保字符串正确存储在数组中。我正在处理这个:

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

int main ()
{
  FILE *fp_data;
  fp_data = fopen("data.dat", "r");
  char *cp_labels[9];

  for (int l=0;l<9;l++)
    {
      fscanf(fp_data, "%s", cp_labels[l]);

      printf("%s\n", cp_labels[1]);
    }

  return 0;
}

我遇到的问题是

fscanf

将每个字符串视为一个字符串(正如它应该的那样),我试图让它将每一行视为一个字符串。

fgets 

是我知道的一个选项,但我似乎无法让它与字符串指针数组一起使用。有任何想法吗?我这样做是因为我希望稍后能够使用该数组的元素作为标签。

最佳答案

这段代码完成了这个工作:

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

int main(void)
{
    const char filename[] = "data.dat";
    FILE *fp = fopen(filename, "r");
    if (fp == 0)
    {
        fprintf(stderr, "Failed to open file %s for reading\n", filename);
        return 1;
    }

    char *cp_labels[9];
    char buffer[4096];

    for (int i = 0; i < 9 && fgets(buffer, sizeof(buffer), fp) != 0; i++)
    {
        buffer[strcspn(buffer, "\n")] = '\0';
        cp_labels[i] = strdup(buffer);
    }

    for (int i = 0; i < 9; i++)
        printf("%d: [%s]\n", i, cp_labels[i]);

    for (int i = 0; i < 9; i++)
        free(cp_labels[i]);

    fclose(fp);
    return 0;
}

示例输出(来自您的数据文件):

0: [Et jet 1]
1: [Et jet 2]
2: [Et jet 3]
3: [Eta 1]
4: [Eta 2]
5: [Eta 3]
6: [Met]
7: [Ht]
8: [Njet]

这使用了fgets(),因为它易于使用且正确。使用 getline() 同样简单:

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

int main(void)
{
    const char filename[] = "data.dat";
    FILE *fp = fopen(filename, "r");
    if (fp == 0)
    {
        fprintf(stderr, "Failed to open file %s for reading\n", filename);
        return 1;
    }

    char *cp_labels[9];
    char *buffer = 0;
    size_t buflen = 0;

    for (int i = 0; i < 9 && getline(&buffer, &buflen, fp) != -1; i++)
    {
        buffer[strcspn(buffer, "\n")] = '\0';
        cp_labels[i] = buffer;
        buffer = 0;
        buflen = 0;
    }
    free(buffer);

    for (int i = 0; i < 9; i++)
        printf("%d: [%s]\n", i, cp_labels[i]);

    for (int i = 0; i < 9; i++)
        free(cp_labels[i]);

    fclose(fp);
    return 0;
}

这会产生相同的输出。

关于c - 将文本文件中的行读取到字符串指针数组中。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36993449/

相关文章:

pointers - 如何使用指针算法获取向量中元素的索引?

c++ - 我从指针得到一个未初始化的对象

ruby - 为什么在 ruby​​ 中动态创建大量符号不是一个好主意(对于 2.2 之前的版本)?

c - 如果 OpenGL 3+ 请求,glfw3 不会绘制?

c++ - 在 C/C++ 中调试 : cost of calling an empty function

CLang-Tidy 警告 rand() 的随机性有限

string - 从 `&' 中获取比当前函数更长生命周期的 str` `String`

javascript - 将一串数字拆分为数组

c++ - 如何使用 C++ new 而不是 C malloc 分配内存

c - openGL 数学书,用于学习矩阵旋转/投影平截头体设置等