2011-07-15 9 views
0

Je tente d'extraire toutes les données du fichier de stockage isolé. Mais je reçois un indice hors erreur de plage. maison^comment^^ ansIndex hors plage dans wp7

StreamReader readFile = new StreamReader(new IsolatedStorageFileStream("AlarmFolder\\alarm.txt", FileMode.Open, myStore)); 

string[] alarmDetailsSeparated; 

String fileText = readFile.ReadLine(); 


//alarmDetailsSeparated is the array that hold the retrieved alarm details from alarm.txt and is split by '^' 
alarmDetailsSeparated = fileText.Split(new char[] { '^' }); 

foreach (string home in alarmDetailsSeparated) 
{ 
    for (i = 0; i < alarmDetailsSeparated.Length;) 
    { 
     if (test > 0) 
     { 
      i = test; 
     } 

     dateSeparate = alarmDetailsSeparated[i]; 
     timeSeparate = alarmDetailsSeparated[i + 1]; 
     labelSeparate = alarmDetailsSeparated[i + 2]; 

     date = dateSeparate; 
     time = timeSeparate; 
     label = labelSeparate; 

     test = test + 3 ; 
     break; 
    } 

    MessageBox.Show("i is " + alarmDetailsSeparated[i]); 
    MessageBox.Show("i + 1 is " + alarmDetailsSeparated[i + 1]); 
    MessageBox.Show("i + 2 is " + alarmDetailsSeparated[i + 2]); 
} 
+0

Si vous savez combien d'éléments sont censés être dans le 'alarmDetailsSeparated', pourquoi ne pas indexer directement au lieu de boucle à travers eux? Vous devriez, bien sûr, vérifier que le nombre attendu d'éléments est effectivement présent. –

+0

Votre boucle for-look est vraiment étrange et on ne sait pas où 'test' est déclaré et ce qu'il contient. – Filburt

+0

pouvez-vous me donner un exemple? Je ne suis pas très sûr de la façon de faire cela –

Répondre

0

Ok, IIUC votre fichier de stockage ressemble à quelque chose comme ceci:

home^date^time^label 
home^date^time^label 
... 

et que vous voulez faire du traitement sur chaque entrée de données d'alarme dans le fichier.

La première chose que vous devez faire est divisé sur chaque ligne:

string[] lines = file.ReadAllLines("alarms.dat"); 
foreach (line in lines) { 
    // handle the alarm data entry (see below) 
} 

Maintenant, vous pouvez faire la scission que vous faites dans votre code:

string[] data = line.Split(new char[] { '^' }); 

Cela devrait vous donner 4 entrées si la ligne a les données que vous voulez, donc vérifier cela:

if (data.Length == 4) { // looks like an alarm data entry 
    // do processing on the alarm data entry (see below) 
} 

les données peuvent maintenant être extraites:

string home = data[0]; 
string date = data[1]; 
string time = date[2]; 
string label = date[3]; 

Et puis agi sur:

MessageBox.Show(String.Format("home {0} at {1} on date {2} with label {3}", 
       home, time, date, label)); 
+0

Salut mes données sont enregistrées dans le fichier de stockage isolé dans une seule ligne telle que cela ressemble à ceci .. home^date^heure^étiquette^home^date^heure^étiquette^home^date^heure^étiquette^... .... –

1

Dans la boucle, vous allez de 0 à la longueur de alarmDetailsSeparated. C'est bien, mais vous indexez alarmDetailsSeparated en utilisant i+1 et i+2.

Cela signifie que lorsque la boucle est à alarmDetailsSeparated.Length-2, le programme indexera alarmDetailsSeparated.Length-2+2 = alarmDetailsSeparated.Length et déclenchera une erreur hors limites.

+0

alors comment dois-je le changer? –

+0

try: 'pour (i = 0; i reece

+0

J'ai essayé de faire le i + = 3 .. Mais j'ai un formulaire d'avertissement visuel studio indiquant que le code inaccessible détecté pour i + = 3 –

1
dateSeparate = alarmDetailsSeparated[i]; 
timeSeparate = alarmDetailsSeparated[i + 1]; 
labelSeparate = alarmDetailsSeparated[i + 2]; 

Les 2 dernières lignes sont les problématiques: si vous Looping de 0 à longueur alarmDetailsSeperated, il n'y a aucune garantie que l'indice actuel + 1 ou 2 existe, rendant ainsi ce code pas en sécurité (comme vous voyez, vous obtenez une exception).

Une solution simple serait de modifier votre boucle:

for (i = 0; i < alarmDetailsSeparated.Length - 2;) 
+0

j'ai toujours la même erreur –

+0

La seule pièce manquante est ce que la valeur «test» prend quand la boucle est initialisée? et pourquoi est-ce nécessaire? –

+0

test prend la valeur de 0 et 3 quand il est en boucle pour la première fois .. je mets le test dedans pour le faire continuer en boucle au lieu de boucler pendant une seule fois –