2014-10-05 4 views
0

.txt 파일에서 읽는 프로그램이 있습니다동일한 .txt 파일, 크기가 다릅니 까?

나는 cmd 프롬프트를 사용하여 읽을 텍스트 파일의 이름으로 프로그램을 실행합니다.

예 :은 Program.exe MYFILE.TXT

문제는 때때로 그렇지 않습니다, 때로는 작동한다는 것입니다.

원본 파일은 130KB이며 작동하지 않습니다. 내용을 복사하여 붙여 넣으면 파일 크기는 65KB이고 작동합니다. 파일을 복사하여 붙여 넣고 이름을 바꾸면 130KB이고 작동하지 않습니다.

아이디어가 있으십니까?

더 많은 테스트 후에는이 작동하지 만드는 것입니다 것을 보여줍니다

int main(int argc, char *argv[]) 
{ 
    char *infile1 
    char tmp[1024] = { 0x0 }; 
    FILE *in; 
    for (i = 1; i < argc; i++) /* Skip argv[0] (program name). */ 
    { 
     if (strcmp(argv[i], "-sec") == 0) /* Process optional arguments. */ 
     { 
      opt = 1; /* This is used as a boolean value. */ 

      /* 
      * The last argument is argv[argc-1]. Make sure there are 
      * enough arguments. 
      */ 

      if (i + 1 <= argc - 1) /* There are enough arguments in argv. */ 
      { 
       /* 
       * Increment 'i' twice so that you don't check these 
       * arguments the next time through the loop. 
       */ 

       i++; 
       optarg1 = atoi(argv[i]); /* Convert string to int. */ 

      } 
     } 
     else /* not -sec */ 
     { 
      if (infile1 == NULL) { 
       infile1 = argv[i]; 
      } 
      else { 
       if (outfile == NULL) { 
        outfile = argv[i]; 
       } 
      } 
     } 
    } 

    in = fopen(infile1, "r");  

    if (in == NULL) 
    { 
      fprintf(stderr, "Unable to open file %s: %s\n", infile1, strerror(errno)); 
      exit(1); 
    } 

    while (fgets(tmp, sizeof(tmp), in) != 0) 
    { 
     fprintf(stderr, "string is %s.", tmp); 
     //Rest of code 
    } 
} 

를 작동하거나, while 루프 내부의 코드가 실행됩니다하지 여부.

tmp가 작동하면 실제로 값이 있습니다. 작동하지 않을 때 tmp에는 값이 없습니다.

편집 : 나 (fgetws를 사용하려면

감사합니다, 우리는 문제가 무엇인지 알고, 을 sneftel하는) 대신는 fgets(), 내가 * wchar_t에로의 tmp를 필요로하는 대신 문자의 * . 유형 캐스팅이 작동하지 않는 것 같습니다. tmp의 선언을 으로 변경하려고 시도했습니다. wchar_t tmp [1024] = {0x0}; 하지만 tmp는 내 코드의 다른 곳에서 사용되는 strtok()의 ​​매개 변수라는 것을 알았습니다. 여기에 내가 그 기능에 뭘하려 I :

//tmp is passed as the first parameter in parse() 
void parse(wchar_t *record, char *delim, char arr[][MAXFLDSIZE], int *fldcnt) 
{ 
    if (*record != NULL) 
    { 
     char*p = strtok((char*)record, delim); 
     int fld = 0; 
     while (p) { 
      strcpy(arr[fld], p); 
      fld++; 
      p = strtok('\0', delim); 
     } 
     *fldcnt = fld; 
    } 
    else 
    { 
     fprintf(stderr, "string is null"); 
    } 
} 

그러나 타입 캐스팅 중 하나가 작동하지 않습니다 strtok를에 *는 char.

지금 난 그냥에 UTF-16에서 파일을 변환하는 방법을 찾고 있어요 UTF-8은 너무 TMP는 나는 그것이 도움이 될 수있는 것처럼 보이지만 예제에 사용되는이 발견 * char 형이 될 수 있습니다 사용자가 UTF-16으로 입력 한 내용을 어떻게 파일에서 가져올 수 있습니까? http://www.cplusplus.com/reference/locale/codecvt/out/

답변

1

원본 파일이 UTF-16으로 인코딩 된 것처럼 들립니다. 텍스트 편집기에서 복사/붙여 넣기를 수행하면 새 (기본 인코딩) (ASCII 또는 UTF-8) 텍스트 파일로 결과가 저장됩니다. 단일 문자는 UTF-16 인코딩 파일에서 2 바이트를 사용하지만 UTF-8 인코딩 파일에서는 1 바이트 만 사용하기 때문에 저장시 파일 크기가 대략 반으로 줄어 듭니다.

UTF-16은 정상적으로 작동하지만 유니 코드 인식 기능 (즉, fgets 아님)을 사용해야합니다. 현재 유니 코드 재즈를 다루고 싶지 않고 파일에서 처리 할 비 ASCII 문자가 실제로 없으면 수동 복사 (복사/붙여 넣기 또는 명령 줄 유틸리티)를 실행하십시오.

+0

감사합니다. 그럴 수있는 것처럼 들리네. :) "모든 유니 코드 재즈"를 다룰 수있게되기 시작할 수있는 곳을 아십니까? – user1420563

+0

대부분의 표준 입출력 루틴에는 와이드 문자 버전이 있습니다. 예를 들어'fgetws '문서를 보라. 문제는 파일에 와이드 문자 인코딩이 있는지 미리 감지하거나 알 필요가 있습니다.ASCII 또는 UTF-8을 사용하는 것이 가장 좋습니다. 후자는 다국적 캐릭터를 포함하는 문자열을 ASCII가 아닌 많은 것으로 할 수있게 해줍니다. – Sneftel

관련 문제