2014-01-31 11 views
0

У меня есть задание создать мою собственную версию UNIX ar в C. Я разбил назначение на несколько частей, и я просто пытаюсь записать имена файлов в другой файл (который будет моим архивом) на этом этапе. Я могу создать файл, и когда я использую printfs, чтобы убедиться, что получаю правильные аргументы из командной строки, имена файлов верны. Когда я открываю созданный мной файл, который должен содержать эти имена файлов, все происходит на азиатском языке.Файл написан на китайском языке (я думаю?)

Я исследовал проблему и не нашел многого для продолжения. Единственное, что я нашел, - это то, что файлы кодируются по-разному, но я довольно смущен в этот момент.

#include <stdlib.h> 
#include "ar.h" 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main (int argc, char **argv) 
{ 
    char *file_name, *archive_name; 
    size_t count = 50; 
    int i, fd, num_written; 

    //command line options to do later 
    //argv[1] 

    //get archive name 
    archive_name = argv[2]; 

    //get file names to add to archive 
    for (i = 3; i<argc; i++) 
    { 
     file_name = argv[i]; 
    } 

    //create archive file 
    fd = open(archive_name, O_RDWR |O_CREAT|O_APPEND); 
    if (fd < 0){ 
     perror("Error while opening file.\n"); 
     exit(EXIT_FAILURE); 
     } 
    else 
     printf("File %s opened successfully\n", archive_name); 


    //write file names into archive file 
     for (i = 3; i<argc; i++) 
    { 
     printf("file name: %s\n", argv[i]); 
     num_written = write(fd, argv[i], 50); 
     if (num_written == -1){ 
      perror("Error while writing to archive.\n"); 
      exit(EXIT_FAILURE); 
      } 

    } 


    close(fd); 

    return 0; 

    } 
+1

Скомпилируйте все предупреждения и информацию об отладке (например, 'gcc -Wall -g'). Научитесь использовать отладчик ('gdb'). Избегайте неинициализированных переменных (например, 'имя_файла' или' i'). Бойтесь [неопределенного поведения] (http://en.wikipedia.org/wiki/Undefined_behavior) –

+0

Возможно, проблема заключается в вашем редакторе? Попробуйте другой редактор и проверьте, отображаются ли в нем также и китайские буквы. – maja

+0

'num_written = write (fd, argv [i], 50);' Откуда вы знаете, что 'argv [i]' имеет ровно 50 символов? – zwol

ответ

2

Ваш код принимает все аргументы после того, как имя архива составляет 50 байт. Если аргументы короче, программа может сбой или запись случайных данных. Так как это не сбой, и Блокнот (или что-то еще) кажется, что это китайский, я собираюсь предположить, что он написал случайные данные. Используйте strlen, чтобы выяснить, как долго каждый из имен аргументов.

Дополнительно:
вы проверяете argv[2] без проверки argv, что может привести к аварии.
Ничего не с file_name имеет смысл.

+0

Спасибо вам за помощь. Я реструктурировал некоторые функции и использовал функцию strlen, и смог ее поднять и работать. – user3258699

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