我已经遍历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;
}
产生相同的输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句