Как читать и записывать содержимое массива char в файл? - PullRequest
0 голосов
/ 06 января 2010

эта программа принимает ввод пользователя и сохраняется в массив символов. Затем создает файл и помещает эти тексты в новый файл. Проблема в том, что он может копировать только часть перед пробелом. Токовый выход: «как читать» -> «как»

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

int main(int argv, char *argc[]){
    int fd;
    char buffer[100];

    printf("Type your text : ");
    scanf("%s",&buffer);

    fd=open("menew.txt",O_CREAT|O_WRONLY|O_EXCL,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
    if(fd<0){
        printf("file already exist!\n");
        }else printf("file created!\n");

    fd=write(fd,buffer,20);
    if(fd<0){
        printf("error on writing...\n");
        }else printf("successfully written!\n");

    close(fd);
    return 0;
}

Ответы [ 3 ]

5 голосов
/ 06 января 2010

Проблема не в написании, а в чтении - преобразование scanf %s пропускает любой начальный пробел, затем считывает и преобразует до (но не включая) следующего пробела.

Возможно, вы захотите использовать что-то вроде fgets или %[^\n] с scanf.

Редактировать: я должен также упомянуть, что когда / если вы используете преобразование набора сканирования (%[^\n]), вы должны указать длину буфера, в который вы читаете.

Поскольку &buffer в scanf("%s", &buffer); является ошибкой, технически это дает неопределенное поведение, но в действительности я незнать о любой реализации, где это имеет значение.

В этом случае buffer был определен как массив, а не указатель.Имя массива «распадается» на указатель при многих обстоятельствах, но не при использовании в качестве операнда оператора адреса (унарный &).Таким образом, buffer и &buffer дают точно такой же результат, адрес начала массива.

Однако разница все же есть.Когда вы используете просто buffer, вы получаете значение типа pointer to char (учитывая, что буфер является массивом char).Когда вы используете &buffer, вы получаете указатель типа pointer to array of MAXLEN char.

Теперь, когда вы передаете значение в scanf (переменная функция), вы получаете неопределенное поведение, когда / если типпередаваемое вами значение не соответствует типу, ожидаемому при преобразовании, которое вы указали.В действительности, с каждым C-компилятором, о котором я когда-либо слышал, он будет работать нормально, потому что один и тот же адрес будет передан в любом случае.В теории (но только в теории, AFAIK) компилятор может использовать своего рода "толстый указатель", который включает информацию о типе вместе с адресом, поэтому scanf сможет обнаружить несоответствие типов.В действительности, я не знаю ни одного компилятора, который бы делал что-то очень похожее, поэтому вы не увидите никакой разницы между использованием buffer и &buffer в этом случае.

В других обстоятельствах,однако, разница может быть обнаружена.Сложение и вычитание указателей основано на типе, поэтому (например) array+1 и &array + 1 будут давать разные результаты:

#include <stdio.h>

int main() { 
    char array[10];

    printf("%p %p %p\n", array, array+1, &array+1);
    return 0;
}

Это напечатает три числа.Первое число будет произвольным числом, обычно в шестнадцатеричном формате.Второй будет на единицу больше первого, а второй будет на 10 больше первого (потому что я определил его как массив из 10 символов ...)

0 голосов
/ 06 января 2010

Наконец я нашел решение !!! Используйте gets(buffer); момент scanf("%s",&buffer);

0 голосов
/ 06 января 2010

Как минимум одна ошибка:

scanf("%s",&buffer);

должно быть:

scanf("%s", buffer);

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

Edit:

scanf также имеет ограничение, описанное Джерри Коффином.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...