![](/img/trans.png)
[英]C programming: Read (double) numbers from text file, line by line to a 2D array
[英]Read numbers from text file to 2D array
盡管這里有很多例子我似乎無法讓這個工作......
我有一個文本文件,包含許多行,每行有三個(int)值,由一個空格分隔。 例如:
1 0 0
0 0 0
1 0 1
0 0 2
1 0 2
我試圖把它讀成2d數組。
我的代碼到目前為止:
int main(void)
{
char c;
int i = 0;
int maxLines = 18;
char lines[maxLines][BUFSIZ];
FILE *fp = fopen("inputs/control.txt", "r");
if (fp == 0)
{
fprintf(stderr, "failed to open inputs/control.txt\n");
exit(1);
}
char buffer[maxLines];
while (i < maxLines && fgets(buffer[i], sizeof(buffer[0]), fp))
{
sscanf (buffer, "%d %d %d", &lines[i][0], &lines[i][1], &lines[i][2]);
i++;
}
fclose(fp);
return 0;
}
有人可以提供建議我如何進一步開發這個,以便行中的每個值存儲在一個單獨的數組索引中? 在上面的例子中,我們將存儲類似於:
lines[0][0] = 1
lines[0][1] = 0
lines[0][2] = 0
and so on.....
目前,它將整行存儲在單個數組pos中。
你可能會說我是一個C菜鳥,任何幫助都會很棒!
使用scanf
。 例:
#include <stdio.h>
int main(int argc, char *argv[]) {
int i, j;
int lines[18][3];
i = 0;
while (
i != sizeof(lines) / sizeof(lines[0])
&& 3 == scanf("%i %i %i", lines[i] + 0, lines[i] + 1, lines[i] + 2)
) {
i++;
}
for (j = 0; j !=i; j++) {
printf("%i %i %i\n", lines[j][0], lines[j][1], lines[j][2]);
}
return 0;
}
請注意,輸入是從stdin讀取的(使用fscanf
以獲得更大的靈活性),這意味着必須將上面的代碼段調用為./a.out < data.txt
。
你很順利,你只是想到你正在讀一個字符數組而不是一個有符號字符數組(可以改為int等),這是你的例子:
#include <stdio.h>
#define MAXB 32
#define MAXL 18
#define MAXD 3
int main(void)
{
int i = 0;
int numlines = 0;
char buf[MAXB] = {0};
char lines[MAXL][MAXD];
FILE *fp = fopen("inputs/control.txt", "r");
if (fp == 0)
{
fprintf(stderr, "failed to open inputs/control.txt\n");
return 1;
}
while (i < MAXL && fgets (buf, MAXB - 1, fp))
{
if (sscanf (buf, "%hhd %hhd %hhd", &lines[i][0], &lines[i][1], &lines[i][2]) == 3)
i++;
}
fclose(fp);
numlines = i;
int j = 0;
for (i = 0; i < numlines; i++)
for (j = 0; j < MAXD; j++)
printf (" line[%2d][%2d] : %hhd\n", i, j, lines[i][j]);
printf ("\n");
return 0;
}
產量
$ ./bin/read_array_a3
line[ 0][ 0] : 1
line[ 0][ 1] : 0
line[ 0][ 2] : 0
line[ 1][ 0] : 0
line[ 1][ 1] : 0
line[ 1][ 2] : 0
line[ 2][ 0] : 1
line[ 2][ 1] : 0
line[ 2][ 2] : 1
line[ 3][ 0] : 0
line[ 3][ 1] : 0
line[ 3][ 2] : 2
line[ 4][ 0] : 1
line[ 4][ 1] : 0
line[ 4][ 2] : 2
注意: char lines[MAXL][MAXD];
沒關系,您必須明白每個元素都限制為8位有符號值,這意味着-128 < val < 127
之間的值。 如果需要存儲更大的值,可以將它們設為int
。
使用fgets,您正在從文件中讀取整行。 然后,您需要解析此行以提取單個數字並將其存儲到數組中。 在while循環中,您可以讀取緩沖區中的行,然后使用類似strtok / sscanf的內容來解析每個數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.