我已经遍布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
是我所知道的一个选项,但我似乎无法使用字符串指针数组。有任何想法吗?我是这样做的,因为我希望以后能够将这个数组的元素用作标签。
答案 0 :(得分:0)
此代码完成工作:
#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;
}
产生相同的输出。