Я пытаюсь загрузить текстовый файл с разделителями табуляции и пробела в двумерный массив. Файл выглядит примерно так:
1 -3 4
4 -3 7
8 -1 10
У меня есть доступ к фрагменту кода, который предполагает, что допустимо сделать что-то вроде следующего:
int nums[][] = {
#include "matrix.txt"
};
Однако, когда я пытаюсь скомпилировать этот код, я получаю ошибку:
$ gcc hangserver.c
hangserver.c:10:5: error: array type has incomplete element type
In file included from hangserver.c:11:0:
matrix.txt:1:5: error: expected ‘} before numeric constant
$
Я знаю, что есть менее элегантные способы загрузить этот файл в массив, однако из чистого любопытства я хотел бы знать, можно ли реализовать описанную выше методологию. Большое вам спасибо за то, что нашли время, чтобы ответить на мой вопрос.
Должна быть запятая после каждого числа, и каждая строка должна находиться внутри {}
:
{ 1, -3, 4 },
{ 4, -3, 7 },
{ 8, -1, 10 }
В вашем подходе есть концептуальная проблема.
Если, например, вы
1, 2, 3, 4, 5, 6,
Как компилятор должен знать, что вы хотите массив 3x2 или 2x3 или 1x6 или 6x1?
Поэтому он должен знать количество столбцов заранее.
В приведенном выше примере
int matrix [][3] = {
# include "data.txt"
};
будет также делать следующее:
int matrix [][2] = {
# include "data.txt"
};
и это:
int matrix [][1] = {
# include "data.txt"
};
и это:
int matrix [][6] = {
# include "data.txt"
};
Хотя вы получаете предупреждение компилятора о отсутствующих фигурных скобках, так как (для 1- го случая) выше data.txt
действительно должен выглядеть так:
{1, 2, 3,},{4, 5, 6,},
(Конец ,
необязательный.)
Чтобы полностью управлять этим через файлы снаружи, выполните:
int matrix[][
# include "colums.txt"
] = {
# include "data.txt"
};
Здесь содержимое columns.txt
будет просто целым числом, описывающим предполагаемое количество столбцов, данные из data.txt
должны быть разбиты на.
Линия расширяется:
int nums[][] = {
1 -3 4
4 -3 7
8 -1 10
};
что неприемлемо для синтаксиса C и C++. Попробуйте сменить файл matrix.txt на
{1, -3, 4},
{4, -3, 7},
{8, -1, 10}
int nums[][]
недействителен. Максимальная гибкость, которую вы можете иметь, этоint nums[][<some integer>]
.