2010-04-04 2 views
0

Я хочу написать несколько поддельного текста в файле («HelloWorld» текст в файле с именем HelloWorld), но не с начала. Я думал до lseek() функция.C: lseek(), связанный вопрос

Если я использую следующий код (отредактирован):

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

#define fname "helloworld" 
#define buf_size 16 

int main(){ 

    char buffer[buf_size]; 
    int fildes, 
     nbytes; 
    off_t ret; 

    fildes = open(fname, O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR); 
    if(fildes < 0){ 
     printf("\nCannot create file + trunc file.\n"); 
    } 
//modify offset 
    if((ret = lseek(fildes, (off_t) 10, SEEK_END)) < (off_t) 0){ 
     fprintf(stdout, "\nCannot modify offset.\n"); 
    } 
    printf("ret = %d\n", (int)ret); 

    if(write(fildes, fname, 10) < 0){ 
     fprintf(stdout, "\nWrite failed.\n"); 
    } 

    close(fildes); 

    return (0); 
} 

, он компилирует хорошо, и она работает без каких-либо явных ошибок. Тем не менее, если я:

cat helloworld 

Выход не то, что я ожидал, но:

helloworld 
Can 

Где «Может» пришедшего из, и где мои пустые пространства?

Должен ли я ожидать «нулей» вместо пробелов? Если я пытаюсь открыть helloworld с gedit, возникает ошибка, жалуясь, что кодировка символа файла неизвестна.

СПУСТЯ EDIT: После я редактировал мою программу с правом буфера для записи, а затем скомпилировать/запустить снова, файл «HelloWorld» до сих пор не может быть открыт с Gedit. сильный текст

СПУСТЯ EDIT Я понимаю, этот вопрос сейчас. Я добавил в код следующее:

fildes = open(fname, O_RDONLY); 
if(fildes < 0){ 
    printf("\nCannot open file.\n"); 
} 

while((nbytes = read(fildes, c, 1)) == 1){ 
    printf("%d ", (int)*c);  
} 

А теперь вывод:

0 0 0 0 0 0 0 0 0 0 104 101 108 108 111 119 111 114 108 100 

Моя проблема заключалась в том, что я ожидал, что пространства (32) вместо нулей (0).

ответ

1

Помимо ожидая нули в равные пространства, исходная задача была действительно писать больше, чем длина «HelloWorld «string». Чтобы избежать такой проблемы, я предлагаю дать возможность компилятору рассчитать длину ваших постоянных строк для вас:

write(fildes, fname, sizeof(fname) - 1) 

- 1 связано с характером NUL (нулевой, \0), который используется для завершения строк C-стиле, а sizeof просто вернув размер массива, который содержит строку. Из-за этого вы не можете использовать sizeof для вычисления фактической длины строки во время выполнения, но она отлично работает для констант времени компиляции.

«Can», который вы видели в своем первоначальном тесте, почти наверняка является началом одной из строк "\nCannot" в вашем коде; после записи 11 байтов в "helloworld\0" вы продолжали записывать оставшиеся байты из того, что следовало за ним в памяти, что оказалось следующей строковой константой. (Теперь вопрос был изменен, чтобы написать 10 байт, но первоначально опубликованная версия написана 16.)

Наличие символов NUL (= 0, '\0') в текстовом файле может действительно вызвать определенный (но не весь) текст редакторы рассматривают двоичные данные файла вместо текста и, возможно, отказываются его открывать. Текстовый файл должен содержать только текст, а не управляющие символы.

1

Ваш buf_size не соответствует длине fname. Это чтение за буфером и, следовательно, получение более или менее случайных байтов, которые только что сидели после строки в памяти.

2

В этой функции вызова, write(fildes, fname, buf_size), fname имеет 10 символов (плюс завершающая «\ 0» характер, но вы говорите функцию выписывать 16 байт. Кто знает, что в ячейках памяти после fname строки.

Кроме того, я не уверен, что вы имеете в виду «где мои пустые пространства?».

+0

Из моей книги: «Само по себе поиск в конце файла ничего не делает - запрос на чтение новой позиции файла будет возвращать EOF. Если впоследствии запрос на запись в эту позицию , новое пространство будет создано между старой длиной файла и новой длиной, и оно будет дополнено нулями ». Теперь я понимаю, что нули - это не пробелы. Из-за этих нулей я не могу открыть файл с помощью обычного текстового редактора? –

+2

Что вы подразумеваете под "can not open"? Что происходит, когда вы пытаетесь? Если вы хотите знать, что происходит, просмотрите шестнадцатеричный дамп файла (например, открыв оболочку и сделав cat helloworld | xxd) –

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