mvemuri6642 Ответов: 1

Программирование системных вызовов Linux


Как я могу прочитать данные из файла, содержащего целочисленные значения, и записать их в два разных файла .txt на основе условия четности или нечетности значения, используя только функции системного вызова read()/write()?

Что я уже пробовал:

#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
void main(int argc,char *argv[])
{
int fd1,fd2,fd3,n,i,buf[100];
fd1=open(argv[1],O_RDONLY);
fd2=open(argv[2],O_WRONLY);
fd3=open(argv[3],O_WRONLY);
n=read(fd1,buf,sizeof(buf));
for(i=0;i<n;i++)
{
if(buf[i]%2==0)
{
write(fd2,buf,n);
}
else
{
write(fd3,buf,n);

}
}
close(fd1);
close(fd2);
close(fd3);
}

1 Ответов

Рейтинг:
1

OriginalGriff

Во-первых, посмотрите на свой файл данных и решите, как он организован: если он содержит "целые числа", то вам нужно выяснить, как он на самом деле хранится.
Например:

1234
5678
9012
вероятно, это строковое представление целых чисел, а не "целые числа" как таковые. Чтобы прочитать их, вам нужно прочитать строки, чтобы установить, где начинаются и заканчиваются целые числа, и определить конечный символ каждого значения, чтобы решить, является ли целое число четным или нечетным.
Даже если он хранится по-разному, вам нужно будет сделать что-то подобное, так как очень маловероятно, что каждое целое число хранится в непосредственно полезном формате.

И сделайте себе одолжение: сделайте отступ в своем коде!
Гораздо легче понять, что происходит, если вы сделаете отступ:
for(i=0;i<n;i++)
    {
    if(buf[i]%2==0)
        {
        write(fd2,buf,n);
        }
    else
        {
        write(fd3,buf,n);
        
        }
    }
Гораздо легче работать с чем
for(i=0;i<n;i++)
{
if(buf[i]%2==0)
{
write(fd2,buf,n);
}
else
{
write(fd3,buf,n);

}
}


CPallini

5.

k5054

К ОП, также обратите внимание, что open("my_file.txt", O_RDONLY) делает нет создать "my_file.txt-если он еще не существует. Для этого вам нужно будет использовать O_CREAT флаг. Существует несколько причин, по которым open может произойти сбой, вам, вероятно, следует проверить его возвращаемое значение, например

int fd;
fd = open("my_file.txt", O_RDONLY)
if(fd == -1) /* open failed */
{ 
    // handle the error here ...
}