2015-03-21 2 views
0

Предполагалось создать программу, которая считывает первые 100 символов source.txt, записывает их в файл destination1.txt и заменяет все «2» на «S» и записывает их в пункт назначения2 .текст. Ниже мой кодLinux File Read and Write - C++ [Обновлено]

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

using namespace std; 

int main(int argc, const char* argv[]){ 
    argv[0] = "source.txt"; 
    argv[1] = "destination1.txt"; 
    argv[2] = "destination2.txt"; 
    int count=100; 
    char buff[125]; 
    int fid1 = open(argv[0],O_RDWR); 

    read(fid1,buff,count); 
    close(fid1); 

    int fid2 = open(argv[1],O_RDWR); 
    write(fid2,buff,count); 
    close(fid2); 

    //How to change the characters? 
    return 0; 
} 

Спасибо, ребята, я могу сделать копирование. Но как выполнить замену персонажа? Если это fstream Я знаю, как это сделать с циклом for. Но я должен использовать системные вызовы Linux.

+0

строковые литералы имеют тип 'сопзЬ полукокса []', так что вы должны относиться к ним с 'сопзЬ полукокса * 'для предотвращения случайной модификации. Разрешение 'char *' ссылаться на строковые литералы - это просто для обратной совместимости с C, и его следует избегать. Во-вторых, как вы знаете, что 'argv' содержит как минимум 3 элемента? Ответ: нет. Объявите свои собственные указатели или хранилище для этих строк. –

+0

Количество ошибок в этом коде несколько. 'read (fid1, buff, count);' где 'count' равно 100, а' buff' - всего ** 20 ** символов. Если вы не видите, что это проблема, вам нужно просмотреть, как работают функции библиотеки, которые вы вызываете. – WhozCraig

+0

Назначение 'argv' - неопределенное поведение, поскольку ОС принадлежит переменным и может не дать вам полный массив. –

ответ

0

Определяем массив out_buf и копию бафф в out_buf посимвольно, заменив 2-х до S.

... 
read(fid1,buff,count); 
close(fid1); 

char out_buf [125]; 
int i; 
for (i = 0; i < sizeof (buf); i++) { 
    if (buff [i] == '2') 
     out_buf [i] = 'S' 
    else 
     out_buf [i] = buff [i] 
} 
int fid2 = open(argv[1],O_RDWR); 
write(fid2, out_buf,count); 
close(fid2); 

return 0; 
0

Вы должны заменить имя файла задания на что-то вроде этого:

const std::string source_filename = "source.txt"; 
const std::string dest1_filename = "destination1.txt"; 
const std::string dest2_filename = "destination2.txt"; 

Там нет никакой гарантии, что операционная система будет выделять 3 переменные программы.

+0

Спасибо. Является ли 'const string' лучше, чем' const char' и почему? – elChino