Leyendo desde un archivo de texto en una matriz

Estoy tratando de leer un archivo de texto que edité con Vim en una matriz.

El archivo de texto es 30 * 50 y está compuesto por números de un solo dígito. Me he vuelto loco tratando de que funcione, pero creo que tengo problemas debido a los personajes de nueva línea. Esto es lo que he estado usando:

Map::Map(char* filename)
{
grid[30][50] = (0);
string line;
ifstream m_file(filename);
if (m_file.is_open())
        {
                while(m_file.good())
                 {
                        for (int i = 0; i < 30; i++)
                        {
                        getline(m_file,line);
                                 for (int k = 0; k < 50; k++)
                                {
                                int tnum = atoi(line.c_str());
                                grid[i][k] = tnum;
                                }
                        }
                }
                m_file.close();
        }
};

grid se define en el archivo de encabezado como int grid [30] [50].

El código que utilizo para imprimir es el siguiente:

void display_room(int trid[30][50])
{
        for (int i = 0; i < 30; i++)
        {
                for (int k = 0; k < 50; k++)
                {
                        mvprintw(i,k,"%d",trid[i][k]);
                };
        };
};

después de llamar Map sMap = Map ("mapa de prueba");

Simplemente estoy tratando de capturar los números de un solo dígito en una matriz y reimprimir esa matriz (usando maldiciones). Actualmente, lee el archivo de mapa de prueba e imprime todos los ceros, sin importar lo que haya en el archivo de mapa de prueba.

preguntado el 27 de agosto de 11 a las 18:08

Está bien. Cuestiones. ¿Qué problemas? -

Cuando imprime los números, solo imprime todos los ceros. Incluso cuando cambio los números desde el archivo "mapa de prueba". -

3 Respuestas

Si entiendo su problema: su análisis establece el valor de toda la línea donde solo debe estar un dígito ...

int tnum = atoi(line.c_str());
grid[i][k] = tnum;

Traducir el dígito (ASCII a un int / byte / ... se puede hacer de esta manera:

grid[i][k] = line[k] - '0';

(Quizás se necesite algo de yeso).

Respondido 27 ago 11, 23:08

Y también debes while(m_file.good()) probablemente debería ser if(...). De lo contrario, el bucle for puede ejecutarse varias veces. La verificación del estado del archivo debe estar dentro del bucle for en la variable i. - erikH

Su sugerencia de restar cero no funcionó al principio, pero simplemente cambié el tiempo a un si y el problema está resuelto. Muchas gracias, ¡he estado luchando con algo tan simple como esto durante tanto tiempo! El mismo código se imprime bien cuando uso cout, pero no cuando uso la biblioteca de curses. No estoy seguro de qué cambió. - syl

En el bucle interno, estás llamando atoi con el contenido completo de la línea cada vez. Como la línea tiene 50 caracteres, atoi no puedo convertirlo en un int (el mayor valor representable por un int es 2147483647, y su número probablemente sea mayor que eso). Cuando atoi falla, vuelve 0.

Lo que quiere es convertir cada carácter de la línea en un int. Algo como eso:

for (int i = 0; i < 30; i++)
{
    getline(m_file,line);
    for (int k = 0; k < 50; k++)
    {
        // The ASCII character of the digits 0 to 9 have
        // successives values.
        int tnum = line[k] - '0';
        grid[i][k] = tnum;
    }
}

Respondido 27 ago 11, 23:08

Mire su código nuevamente. Trate de ver lo que realmente dice en lugar de lo que espera que diga.

int tnum = atoi(line.c_str());

Desea borrar esa línea para leer cada uno de los cincuenta números en la línea por turno. Pero no dice eso. Intenta girar el todo línea en un número entero (e intenta hacerlo cincuenta veces).

Dado que sus números son de un solo dígito, en realidad necesita algo mucho más simple

int tnum = line[k] - '0';

Al decir la línea [k] obtendrá un dígito diferente cada vez que rodee el ciclo (porque k aumenta cada vez que rodee el ciclo). los - '0' bit es solo un truco para convertir un carácter en un número entero. Vea si puede averiguar cómo funciona.

Respondido 27 ago 11, 23:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.