2016-10-31 5 views
1

Под моим виртуальным изображением Ubuntu я играл с открытыми и записывал системные вызовы на C и получал самую смешную ошибку, которую я когда-либо имел!Забавная запись Ошибка SysCall: печатает китайские символы в .txt

В принципе, я получаю дескриптор файла из open и записываю вход, который поступает из записи в файл .txt. Пользователь сообщает открытой функции, где искать файл /, где можно создать файл.

  • Если файл не был создан, открыт будет создавать его для меня
  • Если там уже, я буду добавлять ввод в конец файла

    int main(int argc, char* argv[]{ 
    int fd; 
    int bytesWritten; 
    
    //open and create file if it's not been created yet 
    fd = open(argv[1], O_CREAT|O_WRONLY|O_APPEND , S_IRWXU); 
    if(fd == -1){ 
        perror("Open error:\n"); 
        exit(EXIT_FAILURE); 
    } 
    
    bytesWritten = write(fd,"Hello mate!\n",20); 
    if(bytesWritten == -1){ 
        perror("Write error:\n"); 
        exit(EXIT_FAILURE); 
    } 
    //fysnc 
    return 0;} 
    

Если я печатать на стандартный вывод (1) (изменение FD 1), я получить ожидаемый результат:

Hello mate!

НО, если я использую записи, как показано выше вещей получить действительно странно (и смешно) Error

Это заставило меня смеяться, то файл будет создан, и если я исполню программка пару раз файл начнет расти и расти.

BTW, я выполнить программу так:

./copy /home/b/Desktop/Examples/U3/test.txt

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

Просто любопытный

+1

Может Gedit угадывает кодировку файла неправильно. Я бы предположил, что вы используете какой-либо шестнадцатеричный редактор, чтобы проверить, какой контент у вас есть на самом деле, чтобы убедиться, что все в порядке. – user694733

+1

Или попробуйте выход команды cat в tue Terminal – mame98

+0

@ mame98 thx, я сам забыл об этом. Он печатает сообщение об ошибке, которое я не могу напечатать из-за китайских символов. Я думаю, –

ответ

1

Хорошо, вы, ребята, я только что нашел решение этой проблемы, и я должен извиниться за то тратить свое время ...

Мой партнер переименовал папку, в которой находился файл (например, для ex. от Ü3 до U3) и нажмите enter. Этот вид разрушенного кодирования файлов ...

Создание исходного файла в другой, свежая папка решает вопрос ..

+0

У меня не получилось, что вы только что создали новую папку или каталог? – Anjaneyulu

+0

*** Re *** создание файла, вероятно, решило проблему. – alk

+0

Переименование папки не должно касаться содержимого файла (ов) внутри папки, и это не изменит способ интерпретации файла (ов), по крайней мере, не с помощью gedit. – alk

1

Здесь

write(fd,"Hello mate!\n",20); 

более написано, чем это предусмотрено.

Строковый литерал имеет размер 12 + 1 char s. Код записывает 20. Итак, семь из недопустимой памяти содержат мусор.

Выполнение этого действия вызывает неопределенное поведение, с этого момента все может произойти.

Чтобы исправить это можно сделать:

write(fd, "Hello mate!\n", 12); 

или

write(fd, "Hello mate!\n", sizeof "Hello mate!\n" - 1); 

или

#define MYMSG "Hello mate!\n" 

... 

write(fd, MYMSG, sizeof MYMSG - 1); 

или

char mymsg[] = "Hello mate!\n"; 

... 

write(fd, mymsg, sizeof mymsg - 1); 

или

char mymsg[] = "Hello mate!\n"; 

... 

write(fd, mymsg, strlen(mymsg)); 

или

const char * pmymsg = "Hello mate!\n"; 

... 

write(fd, pmymsg, strlen(pmymsg)); 

...

+0

Отличный ответ, THX для этого. Но я уже делал это раньше, и нет проблем с печатью больше, чем у вас на самом деле. В любом случае я реализовал ваше решение, но, к сожалению, это ничего не изменило. Я играл с открытыми и пишущими раньше, но у меня никогда не было такой ошибки. –

+1

'const * char pmymsg =" Hello mate! \ N ";' Вы имели в виду 'char const *'? – user694733

+0

@BigDude: Вы начали повторное тестирование с * новым * (пустым) файлом для записи? – alk

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

  • Нет связанных вопросов^_^