2014-04-17 7 views
0

SQL Server에서 데이터를 읽고 텍스트 파일에 쓰는 vb6 프로그램이 있습니다. 각 레코드는 개행 문자로 구분됩니다. 이러한 파일 (200MB 이상일 수도 있음)은 sqlite 데이터베이스에서 iPad로 읽고 써야합니다. 메모리 경고를 피하기 위해 나는 C에서이 기능을 사용하여 파일의 모든 한 줄을 읽어ios에서 C로 큰 텍스트 파일 읽기

"strRet는" 가 이

"는 NSString * stringa"입니다 문자열 C가

있는 NSString으로 변환 C

에서 읽은 문자열입니다
NSDictionary *readLineAsNSString(FILE *f,int pospass,BOOL testata,int primorecord ) 
{ 
    char *strRet = malloc(BUFSIZ);//(char *) togliere perche con c potrebbe restituire un int 
    if (strRet==NULL) 
    { 
     return nil; 
    } 

    int size = BUFSIZ; 

    BOOL finito=NO; 
    int pos = 0; 
    int c; 
    fseek(f,pospass,SEEK_SET); 

    do{ // read one line 

     c = fgetc(f); 

     if (pos >= size-1) 
     { 
      size=size+BUFSIZ; 
      strRet = realloc(strRet, size); 
      if (strRet==NULL) 
      { 
       return nil; 
      } 

     } 

     if(c != EOF) 
     { 
      strRet[pos] = c; 
      pos=pos+1; 
     } 
     else 
     { 
      finito=YES; 
     } 

    }while(c != EOF && c != '\n'); 

    if (pos!=0) 
    { 
     strRet[pos] = '\0'; 
    } 

    NSString *stringa=[NSString stringWithCString:strRet encoding:NSASCIIStringEncoding]; 

    if (pos==0) 
    { 
     [email protected]""; 
    } 

    long long sizerecord; 
    if (pos!=0) 
    { 
     sizerecord= (long long) [[NSString stringWithFormat:@"%ld",sizeof(char)*(pos)] longLongValue]; 
    } 
    else 
    { 
     sizerecord=0; 
    } 
    pos = pospass + pos; 

    NSDictionary *risultatoc = @{st_risultatofunzione: stringa, 
           st_criterio: [NSString stringWithFormat:@"%d",pos], 
           st_finito: [NSNumber numberWithBool:finito], 
           st_size: [NSNumber numberWithLongLong: sizerecord] 
           }; 

    //Svuoto il buffer 
    free(strRet); 
    // free(tmpStr); 
    strRet=NULL; 

    return risultatoc; 

} 

그러나 파일에 특수 문자가있는 경우 (예 : € 기호 나 악센트 부호가있는 문자 또는 일부 북유럽 국가) 레코드가 올바르게 읽히지 않으며 NSString을 임의로 찾습니다. 문자 대신에 당신이 나를 도와 줍니까? 고맙습니다!

NSString *stringa= [NSString stringWithCString:strRet encoding:NSASCIIStringEncoding]; 

그러나, € 기호 또는 악센트 문자가 ASCII의 일부가 아닌 :

+0

'stringWithCString : encoding' 메소드에서'encoding'을'NSWindowsCP1252StringEncoding'으로 변경하십시오. http://www.madore.org/~david/computers/unicode/cstab.html#CP1252 – bobnoble

답변

1

다음 줄은 ASCII 데이터가 아이폰 OS를 알려줍니다. 그래서 당신은 분명히 다른 것을 가지고 있습니다.

그림 밖으로 무엇을 인코딩 (예 : UTF-8, 윈도우 ANSI, ISO-8859-1)하고 그에 따라 라인을 업데이트는, 예를 들면 :

NSString *stringa= [NSString stringWithCString:strRet encoding: NSWindowsCP1251StringEncoding]; 

업데이트

알아내는 것 인코딩이 사용되는 것은 까다로울 수 있습니다.

VB6과 SQL Server는 일반적으로 인코딩을 망칠 필요가 없으므로 VB6과 SQL Server는 좋은 조합입니다. 약한 부분은 텍스트 파일로, 인코딩에 따라 다르지만 사용 된 인코딩에 대한 명시적인 정보는 포함되어 있지 않습니다. VB6은 아마도 언어 설정에 따라 Windows 기본 설정을 사용합니다. 불행히도 Windows에서 기본 인코딩을 볼 수있는 위치를 모르겠습니다.

서양 국가에서 인코딩은 일반적으로 Windows ANSI 일명 코드 페이지 1251로 설정됩니다 (여기서 상수는 NSWindowsCP1251StringEncoding의 출처입니다).

더 많거나 적게 확인할 수 있습니다. 유로 기호 (€)가 들어있는 텍스트 파일을 열면 CP 1251로 인코딩 된 경우 80 (16 진수) 값을 사용해야합니다. Latin-1 (ISO-8859-1)에서는 유로 기호를 나타낼 수 없습니다. Latin-9 (ISO-8859-15라고도 함)에서는 A4 (16 진수)를 사용합니다. 그리고 UTF-8에서는 3 바이트가 필요합니다 : E2 82 AC.

그래서 직접 확인하십시오. 확신이 없으면 관련 텍스트 파일의 16 진 덤프를 추가하십시오.

+0

올바른 인코딩을 찾으려면 어떻게해야합니까?를 참조하십시오. 파일은 VB6의 프로그램에서 창에 쓰여지고 데이터는 SQL 서버에서 읽습니다. –

+0

내 대답의 업데이트를 확인하십시오. – Codo

+0

감사합니다. 적절한 인코딩은 창 1252이었습니다. '€'가 80으로 인식되었으므로 이제 내 앱이 파일에있는 255자를 모두 올바르게 읽을 수 있습니다. http://en.wikipedia.org/wiki/Windows-1252 –