2015-02-12 3 views
0

Решенные. Спасибо lutogniew ..... чуть более усложняю ...C: Системные вызовы и указатели для изменения файла

Так что у меня проблемы с домашним заданием. Назначение заключается в том, чтобы взять файл (используя только системные вызовы), отменить его и записать выходной файл с этими данными с обратной записью (только для ASCII). Уловка заключается в том, что обратная секция должна выполняться с помощью указателей. Я сделал следующее ниже, что действительно работает. Тем не менее, он не использует указатели для изменения.

Мой вопрос, я думаю, как я могу получить доступ к чему-то вроде данных [] с помощью указателей? Или, как я могу прочитать из файла в него. Все, что я пробовал (в основном char **), читает только нулевой.

Любая помощь будет высоко оценена.

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

int main(void) 
{ 
    int i = 0; 
    int fileOut = open("output.txt", O_WRONLY | O_APPEND); 
    int fileIn = open("input.txt", O_RDONLY); 

    int start = lseek(fileIn, 0 , SEEK_CUR); 
    int end = lseek(fileIn, 0 , SEEK_END); 
    int restart = lseek(fileIn, 0-end , SEEK_CUR); 

    char data[end]; 
    char reverseData[end]; 
    read(fileIn, data, end); 
    for(i = 0; i< end; i++){ 
     reverseData[i] = data[end-(i+1)]; 
    } 

    write(fileOut, reverseData, end); 

    return 0; 
} 
+0

Подсказка: данные о символах [конец], * p = данные; Надеюсь, никто здесь не выполнит ваше задание для вас. – bvj

+0

'char reverseData [end];' Лучше надеюсь, что ваш файл не будет больше предела стека вашего процесса. –

+2

Не читайте весь файл в памяти сразу - прочитайте его в кусках. И не используйте lseek для определения размера файла - используйте 'stat' и разбирайтесь с трубой разумно (например, выпустите сообщение об ошибке и прервите) –

ответ

0

Вы должны понимать, что то, что представляется вам как массив в C, в действительности это просто указатель, указывающий на начало памяти, принадлежащей к этому массиву. Этот фрагмент кода должен сделать все вполне понятно:

int test[] = { 1, 2, 3 }; 
int* ptr = test + 2;  // ptr now points to the third element 

EDIT

Что касается загрузки данных в массив: опять же, помните, что сам массив просто пул памяти (буферную) - это начинается там, где указатель, упомянутый выше, указывает на и имеет размер, равный numberOfElements * sizeOfSingleElement. Теперь посмотрим на подпись функции read:

size_t read(int fildes, void* buf, size_t nbytes); 

Он читает nbytes в буфер, на который указывает buf. Звонит в колокол?

+0

На самом деле это не совсем ответит на вопрос. –

+0

@JonathonReinhart Я считаю, что он дает всю справочную информацию, необходимую для понимания проблемы. И ответ напрямую будет делать домашнее задание для искателя. – lutogniew

+0

Если на вопрос не ответить, тогда он должен быть закрыт. –

2

После принятия ответа.

Что-то для ОПА рассматривать в качестве другого подхода:

для удовольствия, а не так серьезный рекурсивного подход полностью изменить файл.

void reverse(int fileIn, int fileOut) { 
    char data; 
    if (read(fileIn, &data, 1) == 1) { 
    reverse(fileIn, fileOut); 
    write(fileOut, &data, 1); 
    } 
} 

int main(void) { 
    int fileOut = open("output.txt", O_WRONLY | O_APPEND); 
    int fileIn = open("input.txt", O_RDONLY); 
    reverse(fileIn, fileOut); 
    close(fileIn); 
    close(fileOut); 
    return 0; 
} 
+0

Приобретено для оригинального подхода, который должен работать до тех пор, пока выполняется стопка! –

+0

@ ring0 Согласен - Конечно, этот подход строго ограничен стеком. Но поскольку OP использует VLA, кажется, что размер стека не вызывает большого беспокойства. – chux

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