2014-10-05 6 views
0

У меня есть программа, которая читает из .txt-файлаТе же файлы .txt, разные размеры?

Я использую приглашение cmd для выполнения программы с именем текстового файла для чтения.

например: program.exe myfile.txt

Проблема заключается в том, что иногда это работает, иногда нет.

Оригинальный файл - 130KB и не работает. Если я копирую/вставляю содержимое, файл составляет 65 КБ и работает. Если я копирую/вставляю файл и переименовываю его, он составляет 130 КБ и не работает.

Любые идеи?

После более тестирования показывает, что это то, что делает это не работает:

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 
    } 
} 

работает ли он или нет, код внутри цикла в то время как запускается на выполнение.

Когда он работает, tmp на самом деле имеет значение. Когда он не работает, tmp не имеет значения.

EDIT:

Благодаря sneftel, мы знаем, в чем проблема, Для меня использовать fgetws() вместо fgets(), мне нужно TMP быть wchar_t * вместо полукокса * , Тип отливки, похоже, не работает. Я попытался изменить объявление tmp на wchar_t tmp [1024] = {0x0}; , но я понял, что tmp является параметром в strtok(), используемом в другом месте моего кода. я вот что я пытался в этой функции:

//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 не работает.

Теперь я ищу способ просто преобразовать файл из UTF-16 в UTF-8, поэтому tmp может иметь тип char * Я нашел это, что похоже, что оно может быть полезно, но в примере, которое оно использует ввод от пользователя как UTF-16, как этот вход может быть взят из файла? http://www.cplusplus.com/reference/locale/codecvt/out/

ответ

1

Это звучит ужасно, как в исходном файле кодируется UTF-16. Когда вы копируете/вставляете его в текстовый редактор, вы сохраняете результат в виде нового (по умолчанию кодировки) (ASCII или UTF-8) текстового файла. Поскольку один символ принимает 2 байта в файле с кодировкой UTF-16, но только 1 байт в файле с кодировкой UTF-8, это приводит к тому, что размер файла примерно вдвое уменьшается при его сохранении.

UTF-16 в порядке, но для работы с ним вам необходимо использовать Unicode-функции (то есть не fgets). Если вы не хотите иметь дело со всем этим юникодским джазом прямо сейчас, и на самом деле у вас нет каких-либо символов, отличных от ASCII, для обработки в файле, просто выполните ручное преобразование (либо с вашей копией/вставкой, либо с помощью командной строки) перед запуском вашей программы.

+0

Спасибо! Это звучит так, будто это может быть так :) Знаете ли вы, где я могу начать искать, чтобы иметь дело с «всем, что Unicode джаз»? – user1420563

+0

Существуют широкоформатные версии большинства стандартных процедур ввода/вывода. См., Например, документацию 'fgetws'. Проблема в том, что вам необходимо либо заранее определить, либо узнать, что файл имеет широкосимвольное кодирование.Лучше всего придерживаться ASCII или UTF-8; последнее позволяет вам делать множество вещей с международными символами, содержащими строки, как если бы они были ASCII, хотя и не все. – Sneftel

Смежные вопросы