49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
1

Не работает read() после wirte()

19.08.2019, 00:42. Показов 2267. Ответов 7
Метки нет (Все метки)

Есть такой кусочек кода :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <unistd.h>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(){
    int fd;
    fd = creat("/home/username/test/test.txt",O_RDWR);
    const char * buf = "test123";
    write(fd,buf,strlen(buf));
    char buffer[strlen(buf)];
    int error =  read(fd,&buffer,strlen(buf));
    std::cout << error << std::endl;
    std::cout << errno << std::endl;
    return 0;
}
при создании файла не работает read() после write(),причем write() отрабатвыает нормально,error = -1,a errno = 9.
Что делать?

Добавлено через 2 минуты
при open() вместо creat() все ок
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2019, 00:42
Ответы с готовыми решениями:

Wirte function that is supposed to go through the objects and find the maxim value from them.
// Every object in objects array contains {name: ‘Name’} and might contain the value. // Function...

WaveStream, не работает Read
Считываю mp3 файл, и перегоняю его в WaveStream(NAudio) с изменением формата. Дале пытаюсь...

Не работает NetworkStream.Read()
Привет, есть проблема, при получении данных через NetworkStream, ничего не происходит, будто ему...

System.in.read как работает?
Мне дали задания заполнить массив вводом с консоли. И я нашёл такую штуку, как System.in.read(). И...

7
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,249
19.08.2019, 00:57 2
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

Цитата Сообщение от ReYalp Посмотреть сообщение
Что делать?
Внимательно читать документацию
creat()
A call to creat() is equivalent to calling open() with flags equal to
O_CREAT|O_WRONLY|O_TRUNC.
Т.е. creat открывает файл только для записи. Поэтому ваш read не срабатывает. При этом, то, что вы передали в mode флаг O_RDWR совершено неправильно, следовательно это и не работает, mode - это не flag.
Про mode написано:
File mode bits:

S_IRWXU
read, write, execute/search by owner
S_IRUSR
read permission, owner
S_IWUSR
write permission, owner
S_IXUSR
execute/search permission, owner
S_IRWXG
read, write, execute/search by group
S_IRGRP
read permission, group
S_IWGRP
write permission, group
S_IXGRP
execute/search permission, group
S_IRWXO
read, write, execute/search by others
S_IROTH
read permission, others
S_IWOTH
write permission, others
S_IXOTH
execute/search permission, others
S_ISUID
set-user-ID on execution
S_ISGID
set-group-ID on execution
S_ISVTX
on directories, restricted deletion flag
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
19.08.2019, 01:04  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
creat()
A call to creat() is equivalent to calling open() with flags equal to
O_CREAT|O_WRONLY|O_TRUNC.
Т.е. creat открывает файл только для записи.
В любом случае? Я думал только в приведенном примере

Добавлено через 4 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
При этом, то, что вы передали в mode флаг O_RDWR совершено неправильно, следовательно это и не работает, mode - это не flag.
спасибо,теперь понял разницу между флагом и модификатором доступа
0
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,249
19.08.2019, 01:08 4
Цитата Сообщение от ReYalp Посмотреть сообщение
В любом случае?
В любом случае. Я же вам процитировал из документации строку.

Цитата Сообщение от ReYalp Посмотреть сообщение
Я думал только в приведенном примере
Как уже было сказано, то, что вы передали в mode флаг O_RDWR, ничего не дает. В mode надо передавать mode.
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

int creat(const char *pathname, mode_t mode);
Видите int flags у open? Вот туда положено передавать O_* флаги. Видите mode_t mode у creat? Туда флаги не передаются.

http://man7.org/linux/man-pages/man2/open.2.html

Читайте документацию, прежде чем писать код. Избавит вас от лишней траты времени и нервов, и необходимости задавать такие вопросы на форумах.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
19.08.2019, 01:09  [ТС] 5
DrOffset, и еще ,Вы не подскажете,как можно добавлять текст в файл с начала таким образом чтобы старый просто "двигался вперед",тоесть переместить старый текст на sizeofinputtext + 1?
0
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,249
19.08.2019, 01:14 6
Цитата Сообщение от ReYalp Посмотреть сообщение
и еще ,Вы не подскажете,как можно добавлять текст в файл с начала таким образом чтобы старый просто "двигался вперед",тоесть переместить старый текст на sizeofinputtext + 1?
Считать то, что было в файле, во временный буфер. Записать новое, потом записать то, что было считано в буфер после.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,450
19.08.2019, 01:17  [ТС] 7
Цитата Сообщение от DrOffset Посмотреть сообщение
creat()
A call to creat() is equivalent to calling open() with flags equal to
O_CREAT|O_WRONLY|O_TRUNC.
У меня был такой пример :
The following typical creat() call,
int fd;
fd = creat (filename, 0644);
if (fd == −1)
/* error */


is identical to
int fd;
fd = open (filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == −1)
/* error */

и вот описание к нему :

As an example, the following code opens the file given by file for writing. If the file
does not exist, assuming a umask of 022 , it is created with the permissions 0644 (even
though the mode argument specifies 0664 ). If it does exist, it is truncated to zero length:

Ни раньше ни позже не было сказано что creat() создает файл в режиме writeonly,даже по флагам open не понятно.

Добавлено через 1 минуту
Так вот я не сразу понял что так оно и есть и начал писать говнокод
0
16269 / 8828 / 2166
Регистрация: 30.01.2014
Сообщений: 15,249
22.08.2019, 23:51 8
Цитата Сообщение от ReYalp Посмотреть сообщение
Ни раньше ни позже не было сказано что creat() создает файл в режиме writeonly
На самом деле было, просто вы этого не уловили. Из вашей цитаты:
The following typical creat() call ... is identical to open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2019, 23:51
Помогаю со студенческими работами здесь

INSERT в while (reader.Read() не работает
Господа, инсёрт в WHILE не рабоатет. В чем дело? в таблице tttt уже есть запись 1 1 no хочу...

Теория. Почему в данном случае copy() не работает после reserve(), но работает после resize()?
Есть такая функция: void Array::SetStartIndexes(sz3_Arr_t *array) { ...

После первого включения компьютера монитор не работает, после повторной перезагрузки - работает.
Когда включаю комп он как обычно грузиться но монитор ничего не показывает. Нажимаю кнопку...

Парсинг на JSOUP APACHE, не работает read и getInputStream
Начинаю писать парс под андроид для динамического сайта. Использую JSOUP и APACHE, проблема состоит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru