NSScanner

  • So dürfte es gehen:

    Quellcode

    1. BOOL success;
    2. NSString *created, *software, *version;
    3. NSMutableString *outputString = [[NSMutableString alloc] init];
    4. NSScanner *myScanner = [NSScanner scannerWithString:importlog];
    5. while (![myScanner isAtEnd])
    6. {
    7. [myScanner scanUpToString:@"#" intoString:nil];
    8. [myScanner scanString:@"#Log File Created On:" intoString:nil];
    9. success = [myScanner scanUpToString:@"\n" intoString:&created];
    10. [myScanner scanString:@"#Software:" intoString:nil];
    11. success &= [myScanner scanUpToString:@"\n" intoString:&software];
    12. [myScanner scanString:@"#Version:" intoString:nil];
    13. success &= [myScanner scanUpToString:@"\n" intoString:&version];
    14. if (success)
    15. {
    16. [outputString appendString:created];
    17. [outputString appendString:@"\n"];
    18. [outputString appendString:software];
    19. [outputString appendString:@"\n"];
    20. [outputString appendString:version];
    21. [outputString appendString:@"\n"];
    22. }
    23. }
    24. [ipAdressView setString:outputString];
    25. [outputString release];
    Alles anzeigen

    Michael

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Michael ()

  • RE: ginge das nicht einfacher?

    Original von Michael
    Es kommt aber trotzdem nicht das aus dem Scanvorgang heraus, was erwartet wird. :P


    Wir haben jetzt zwar ne Lösung, aber wirklich anders ist das doch nicht, oder? gibt lediglich nichts aus, da ist die version mit der initialisierung doch besser, weil sie auch funktioniert, wenn ein teil fehlt. Ich mag diese 1 / 0 (geht / geht nicht) Programmiererei nicht. Ich belibe bei meiner Version ;)

    Max
  • RE: ginge das nicht einfacher?

    Max, der Absturz ist nur ein Problem. Wie man das löst bleibt einem ja selbst überlassen. Der Absturz ist aber nur eine Folge des nicht funktionierenden Scanvorgangs. Mit der Lösung des Absturzproblems (egal wie) ist das Scanproblem nicht behoben. So wie der Kay das programmiert hat, kommt da nie das Erwartete raus. Ob das Programm nun abstürzt oder nicht.

    Michael
  • RE: ginge das nicht einfacher?

    In etwa so????

    Quellcode

    1. - (IBAction)getLogfile:(id)sender
    2. {
    3. NSOpenPanel *openpanel = [NSOpenPanel openPanel];
    4. NSArray *files;
    5. NSString *importlog;
    6. NSArray *types=[NSArray arrayWithObjects:@"log",nil];
    7. [openpanel setCanChooseDirectories:TRUE];
    8. [openpanel setCanChooseFiles:TRUE];
    9. [openpanel setAllowsMultipleSelection:TRUE];
    10. [openpanel runModalForTypes:types];
    11. files=[openpanel filenames];
    12. if(files==nil)
    13. {
    14. NSLog(@"no file selected");
    15. }
    16. else
    17. {
    18. importlog=[NSString stringWithContentsOfFile:[files objectAtIndex:0]];
    19. [theTestView setString:importlog];
    20. }
    21. BOOL *success;
    22. NSString *created;
    23. NSString *software;
    24. NSString *version;
    25. NSMutableString *theInfoString = [[NSMutableString alloc]init];
    26. NSScanner *myScanner = [NSScanner myScannerWithString:importlog];
    27. while (![myScanner isAtEnd])
    28. {
    29. [myScanner scanUpToString:@"#" intoString:nil];
    30.     [myScanner scanString:@"#Log File Created On:" intoString:nil];
    31.     success &= [myScanner scanUpToString:@"\n" intoString:&created];
    32.     [myScanner scanString:@"#Software:" intoString:nil];
    33.     success &= [myScanner scanUpToString:@"\n" intoString:&software];
    34.     [myScanner scanString:@"#Version:" intoString:nil];
    35.     success &= [myScanner scanUpToString:@"\n" intoString:&version];
    36. if (success)
    37.     {
    38.         [theInfoString appendString:created];
    39.         [theInfoString appendString:@"\n"];
    40.         [theInfoString appendString:software];
    41.         [theInfoString appendString:@"\n"];
    42.         [theInfoString appendString:version];
    43.         [theInfoString appendString:@"\n"];
    44.     }
    45. }
    46. [theInfoView setString:theInfoString];
    47. [theInfoString release];   
    48. }
    Alles anzeigen


    Beim Kompilieren kriege ich einen Haufen Fehlermeldungen mit denen ich nichts anfangen kann:

    Was heißt zum Beispiel: stray "/312" in program?????
  • Ich würde diese Abfrage anders machen:

    Quellcode

    1. if(files==nil)
    2. {
    3.    NSLog(@"no file selected");
    4. return;
    5. }
    6.    
    7. importlog = [NSString stringWithContentsOfFile: [files objectAtIndex: 0]];
    8. [theTestView setString: importlog];

    Hat den Vorteil, dass bei keiner Selektion der untere Teil nicht durchlaufen werden muss. Und das stray /312 heißt nichts anderes, als dass die spaces in deinem Code außerhalb der ASCII-Codierung liegen. Das passiert, wenn du Code z.B. aus dem Internet kopierst. Also einfach mit der Suchfunktion in der datei alle spaces suchen und durch 'normale' ersetzen.

    Max
  • Ähm, ja. Sorry, da ist in meinem Beispielcode was falsch gewesen. Die Zeile

    Quellcode

    1. NSScanner *myScanner = [NSScanner myScannerWithString:importlog];

    muss so aussehen:

    Quellcode

    1. NSScanner *myScanner = [NSScanner scannerWithString:importlog];

    Da hatte ich mit Suchen/Ersetzen etwas zu viel ersetzt.

    Michael
  • Ja also es ist so wie es gepostet wurde. Allerdings will der Kompiler trotzdem nicht und gibt folgendes aus:

    Quellcode

    1. initializer element is not constant
    2. importlog' undeclared here (not in a function)
    3. initializer element is not constant
    4. parse error before "while"


    Komische Sache das...sonst hat er sie auch immer gefressen.
  • Original von kay
    Ja also es ist so wie es gepostet wurde.

    Von was für einer anderen Funktion sprichst Du dann? :rolleyes:

    Also, das Einzige was mir noch auffällt ist, dass Du die BOOL Variable success zum Pointer gemacht hast, was falsch ist. Das Sternchen davor muss weg. Ansonsten compiliert der Code bei mir einwandfrei.

    Michael
  • Also hier nochmal der Code, der jetzt drinsteht:

    Quellcode

    1. - (IBAction)getLogfile:(id)sender
    2. {
    3. NSOpenPanel *openpanel = [NSOpenPanel openPanel];
    4. NSArray *files;
    5. NSString *importlog;
    6. NSArray *types=[NSArray arrayWithObjects:@"log",nil];
    7. [openpanel setCanChooseDirectories:TRUE];
    8. [openpanel setCanChooseFiles:TRUE];
    9. [openpanel setAllowsMultipleSelection:TRUE];
    10. [openpanel runModalForTypes:types];
    11. files=[openpanel filenames];
    12. if(files==nil)
    13. {
    14. NSLog(@"no file selected");
    15. return;
    16. }
    17. importlog = [NSString stringWithContentsOfFile:[files objectAtIndex:0]];
    18. [theTestView setString:importlog];
    19. }
    20. BOOL success;
    21. NSString *created;
    22. NSString *software;
    23. NSString *version;
    24. NSMutableString *theInfoString = [[NSMutableString alloc]init];
    25. NSScanner *myScanner = [NSScanner scannerWithString:importlog];
    26. while (![theScanner isAtEnd])
    27. {
    28. [theScanner scanUpToString:@"#" intoString:nil];
    29. [theScanner scanString:@"#Log File Created On:" intoString:nil];
    30. success &= [theScanner scanUpToString:@"\n" intoString:&created];
    31. [theScanner scanString:@"#Software:" intoString:nil];
    32. success &= [theScanner scanUpToString:@"\n" intoString:&software];
    33. [theScanner scanString:@"#Version:" intoString:nil];
    34. success &= [theScanner scanUpToString:@"\n" intoString:&version];
    35. if (success)
    36. {
    37. [theInfoString appendString:created];
    38. [theInfoString appendString:@"\n"];
    39. [theInfoString appendString:software];
    40. [theInfoString appendString:@"\n"];
    41. [theInfoString appendString:version];
    42. [theInfoString appendString:@"\n"];
    43. }
    44. }
    45. [theInfoView setString:theInfoString];
    46. [theInfoString release];
    47. }
    Alles anzeigen


    Und das gibt mir der Kompiler raus:

    Quellcode

    1. initializer element is not constant
    2. importlog undeclared here (not in a function)
    3. initializer element is not constant
    4. parse error before "while"



    Wieso kommt das andauernd? Der Quellcode ist doch eigentlich einwandfrei? :mauer: