Comment lire une grille de données à partir d'un fichier texte en Java?
-
28-10-2019 - |
Question
Quand je dis une grille, je veux dire un tableau multidimensionnel. Je veux parce que je fais un jeu 2D et je veux être en mesure de charger les niveaux de fichiers texte de données. Disons que, par exemple, j'ai ce tableau 2D level[3][3
]. Une simple carte de 3x3. Et j'ai aussi un fichier texte qui se lit comme suit:
1 2 3
4 5 6
7 8 9
Dans c ++, je peux simplement faire:
for (x=0; i<map_width; x++)
{
for (y=0; y<map_height; y++)
{
fscanf(nameoffile, "%d", map[x][y]);
}
}
Et qui placerait tout le contenu du fichier texte en conséquence dans le tableau. POURTANT Je ne sais pas comment faire en java. Y at-il sorte d'équivalent qui vient placer les données dans le tableau en conséquence? Je sais déjà sur la classe du scanner, mais je ne sais pas comment l'utiliser. J'ai cherché google, en vain. Il n'explique pas grand-chose. Aide s'il vous plaît! Plus précisément, je veux savoir comment numériser le fichier et mettre ce int il lit la PLACE APPROPRIÉE dans le tableau.
Mon code actuel est cela, cependant, il jette un NoSuchElementException:
public void loadMap() {
Scanner sc = null;
try {
sc = new Scanner(inputmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
map[x][y] = sc.nextInt();
}
}
Où InputMap est le fichier, map[][]
est une grille de données pour chacune des tuiles sur la carte et la largeur et la hauteur sont pré-spécifiée dans un constructeur.
La solution
Votre question est très inutile en ce qui concerne la façon dont vos fichiers texte seront effectivement mises en forme. Par exemple,
123
456
789
est très différent de
1 2 3
4 5 6
7 8 9
et, en outre, vous ne l'avez pas mentionné si elles sont toujours ints, ou
1 2 3
4 5 6
a b c
etc. Si vous nous avez donné une description précise de ce qui se passe exactement dans ces fichiers texte que nous pourrions vous aider plus. Le mieux que je peux faire est de vous montrer comment utiliser le scanner pour farcir entrée en général:
La boucle serait similaire à Java, mais vous devez initialiser un objet Scanner.
Scanner input = new Scanner(myFile); //whatever file is being read
for (x=0; i<map_width; x++)
{
for (y=0; y<map_height; y++)
{
int nextTile = input.nextInt(); //reads the next int
// or
char nextTile = input.nextChar(); //reads the next char
}
}
Au-delà, il me faudrait en savoir plus sur ce qui est réellement à l'intérieur de ces fichiers d'entrée.
EDIT:
Je copiais votre boucle directement à partir de votre code, mais vous pouvez échanger l'intérieur et extérieur pour les boucles. Ne doit pas être la largeur du paramètre intérieur (lecture de gauche à droite)?
Autres conseils
En Java, il fonctionne de manière similaire -. Créer un objet java.util.Scanner
pour votre fichier et utiliser la méthode de la nextInt
au lieu de fscanf
Si vous ne connaissez pas les dimensions de la grille
static int[][] readFile(String filename) {
try {
File textfile = new File (GridSearchTest.class.classLoader.getResource(filename).toURI());
Scanner fileScanner = new Scanner(textfile);
int size = Integer.parseInt(fileScanner.next());
String line = fileScanner.nextLine();
int[][] grid = new int [size][size];
int i = 0; int j = 0;
while (fileScanner.hasNextLine()) {
line = fileScanner.nextLine();
System.out.println (line);
Scanner lineScanner = new Scanner(line);
while (lineScanner.hasNext()) {
grid[i][j] = Integer.parseInt(lineScanner.next());
i++;
}
lineScanner.close();
i=0;
j++;
}
fileScanner.close();
return grid;
} catch (IOException e) {
System.out.println("Error reading file: "+ e.getMessage());
System.exit(0);
};
}