Я пытаюсь прочитать текстовый файл символов в массив символов (char array [MAX_ROW] [MAX_COL]), а текстовый файл имеет меньше строк и столбцов, чем массив символов. Это приводит к проблеме чтения материала вещества, находящегося в текстовом файле. Я сталкиваюсь с этой проблемой, когда читаю с использованием следующего метода:
ifstream whiteboard; //ifstream object for reading from a file.
whiteboard.open(board_name.c_str());
for(int i = 0; i < MAXROW; i++){ //naive read for canvas, not considering the /n characters or the size of the image.txt
for(int j = 0; j < MAXCOL; j++){ //for this to store the print properly it must be the exact size of the image dimensions
canvas[i][j] = whiteboard.get();
if(whiteboard.get() == '/n'){
return;
}
else if(whiteboard.get() != '/n'){
canvas[i][j] = whiteboard.get();
}
}
}
whiteboard.close();
Вышеприведенный код должен проходить через массив 2d только до точки, где находится символ "/n". Таким образом, я могу ввести массив любого размера. Символ новой строки находится в конце каждой строки текста в текстовом файле (в виде ввода ввода). Чтение файла останавливается при чтении новой строки. Тем не менее, у меня возникают проблемы с его реализацией. Есть ли какие-либо намеки, которые могут помочь мне увидеть это более четко? Большое спасибо!
РЕДАКТИРОВАТЬ:
Входной файл
xxxxxxxxxxxxxx
x x
x x
x x
x x
x x
xxxxxxxxxxxxxx
Я надеюсь вставить поле выше (вместе со всеми его символами, содержащимися в нем) в соответствующие значения массива символов. Я хочу остановить чтение после прочтения самого правого столбца x внутри и после прочтения окончательного x (внизу справа). Вы можете видеть, что моя проблема возникает из-за того, что массив, размер которого больше размера моего текстового поля. Я понимаю, что могу исправить это, приравняв массив символов к тем же размерам, что и текстовое поле, но хочу сохранить достаточно большую константу, чтобы я мог читать в файле относительно большого размера.
У меня есть одно решение, сделайте следующее:
int n=1025, m=1024, MAX_LINES=1025, i=0, j=0;
char character, Matrix[n][m];
fstream file;
file.open("file.txt", ios::in);
while (file.get(character))// loop executes until the get() function is able to read contents or characters from the file
{
Matrix[n][m]=character; // copy the content of character to matrix[n][m], here n is used to work as lines and m as normal arrays.
m++; // finished copying to matrix[n][m] then m++ else the program will overwrite the contents to the same array.
If (m>=1024)// if string[n][m] reached the limit which is 1024.
{
Matrix[n][m]='\0'; //termimate that line
m=0;// start with a new column
if (n<MAX_LINES)// if n is less than 1024 then
n++;// write to a next line because m can support only 1024 chars.
}
Matrix[n][m]='\0';// this will terminate the whole string not just one line.
file.close();
Матричные массивы заполняются до тех пор, пока файл не будет иметь содержимого, но меньше 1024x1024 символов, u может увеличить ввод символов из файла, но я сталкиваюсь с проблемами при приеме в сеть более 4 килобайт данных в матрицу...
Я надеюсь, что это поможет вам, если поможет даже немного, а затем +1 проголосовать за мой ответ PLS...
Если вы не ограничены использованием массива, я хотел бы добавить альтернативное решение, которое позволит вашему холсту быть динамическим.
using std::vector;
std::ifstream whiteboard(board_name);
vector<vector<char>> canvas;
canvas.emplace_back();
// ^ Replace with push_back(vector<char>()); if not using C++11
char c;
while (whiteboard.get(c)) {
if (c == '\n') {
canvas.emplace_back(); // See above
}
else {
canvas.back().push_back(c);
}
}
Вы можете выбрать итерацию через свой холст, используя циклы, основанные на диапазонах, или с помощью индекса (итераторы тоже работают, но уродливы):
// Loop through using range-based for (C++11)
for (auto& row : canvas) {
for (auto& col : row) {
std::cout << col;
}
std::cout << std::endl;
}
// Loop through using index
for (int i = 0; i < canvas.size(); i++) {
for (int j = 0; j < canvas[i].size(); j++) {
std::cout << canvas[i][j];
}
std::cout << std::endl;
}
Вы ищете что-то вроде этого:
ifstream whiteboard;
whiteboard.open(board_name);
if ( !whiteboard.is_open() )
{
// do something here...
}
char c;
int row = 0, col = 0;
while ( whiteboard.get( c ) )
{
if ( c == '\n' )
{
row++;
col = 0;
continue;
}
canvas[ row ][ col++ ] = *reinterpret_cast< unsigned char * >( &c );
}
whiteboard.close();
С помощью этого кода вы можете заполнить свою матрицу содержимым файла... всегда предполагая, что "массив" в файле вписывается в массив canvas[][]
'/n'
->'\n'