2012-02-18 4 views
-2

Предположим, у меня есть текстовый файл, который говорит: Этот файл содержит простой текстКак разбить текстовый файл на части в C?

Теперь я хочу разделить этот текстовый файл в «N» число частей с одинаковыми символами. Предположим, что пользователю нужны три деления, тогда должны быть созданы файлы 1.txt, 2.txt и 3.txt с примерно 8 символами.

(Следующая часть этой программы состоит в том, чтобы вернуться в исходное состояние этих файлов, но я уверен, что смогу сделать это сам, если я смогу получить помощь в этой первой части).

Можете ли вы, ребята, вести меня в этом вопросе?

Язык используется C.

void main(int argc, char** argv) 
{ 
int iChunkNo=0; 
char cFileName[30]; 

iChunkNo = atoi(argv[2]); 
strcpy(cFileName, argv[1]); 

printf("The file will be divided into %d chunks \n", iChunkNo); 

FILE* file_read_pointer; 
file_read_pointer = fopen(cFileName, "r"); 

int iCount=0; 
char ch; 

while (1) 
{ 
     ch = fgetc(file_read_pointer); 
     if (ch == EOF) 
      break; 
     ++iCount; 
} 

printf("The number of characters in the file is: %d \n", iCount); 

int iCharPerFile = 0; 
iCharPerFile = iCount/iChunkNo; 

printf("The number of characters per chunk file will be: %d \n", iCharPerFile); 

FILE* file_write_pointer; 

int j=1; 
for(j; j<=iChunkNo; j++) 
{ 
    char num[5] = {j}; 
    char ext[4] = {"txt"}; 

    char name[15]; 
    sprintf(name, "%d.%s", j, ext);  

    FILE* file_write_pointer; 
    file_write_pointer = fopen(name, "w"); 
} 

int i=0; 

for(i; i<iCharPerFile; i++) 
{ 
    char temp; 
    temp = fgetc(file_read_pointer); 
    //fputc(temp, file_write_pointer); 
    fprintf(file_write_pointer, "%c", temp); 
} 
} 
+4

Этот вопрос имеет четкое представление о домашнем задании. – dasblinkenlight

+0

Вы считаете пробелы и символы новой строки символами? Если это так, вы всегда можете просто пересчитать все символы, чтобы получить полное разделение на 'n', а затем выводить после прочтения общих/'n' символов. –

+0

@JamesMcLaughlin Я не полный кодовый копир :) Мне нравится программирование, но оно меня разозлило, когда я застрял. Я пытаюсь опубликовать свой код. См. Комментарии ниже. Не позволю мне опубликовать его здесь. – Asim

ответ

1

Вы могли бы сделать что-то вроде этого:

  • Найти размер файла (используя fseek и ftell). Затем обратитесь назад к началу
  • Определить размер вам нужно записать в каждый файл (размер/п)
  • Читать по одному символу за раз (используйте getc) и записать в соответствующий файл (putc)
    • Используйте sprintf(fname, "%d.txt", index) строить такие имена, как «1.txt»
    • Используйте fopen, чтобы открыть файлы и сохранить FILE *current, к которому вы пишете на каждом шаге

Как говорится, вы должны начать медленно. Сначала создайте программу, которая просто копирует один файл в другой, используя getc + putc и прокладывайте себе путь вверх.

+0

Спасибо за помощь.У меня уже есть своя программа, которая копирует текст из одного файла в другой. В этом задании я уже реализовал следующее: 1- Проверить общее количество символов 2- Определить количество символов в файле 3- Создать необходимое количество текстовых файлов. Теперь я попытаюсь привести код в соответствие с вашими предложениями. В прошлый раз, когда я скомпилировал, он только скопировал странный символ YYYYYYYY в результирующий текстовый файл. Lol – Asim

0

Вам нужно будет выяснить, сколько текста есть в целом, возможно, «разрывая» весь файл в памяти. Это будет отлично работать для размеров файлов до мегабайт в размере, но не для гигабайт и более.

Затем вам нужно знать, сколько частей нужно разбить на (обработка аргументов командной строки?), И, следовательно, сколько данных нужно писать для записи в каждую часть. За этим последует создание каждого из выходных файлов, запись правильного сегмента данных в файл и его закрытие.

Предположим, что файл имеет 29 байтов, и вам необходимо разбить его на 3 части. Будете ли вы создавать 2 части с 9 байтами и один с 11 или 2 с 10 и один с 9. Как насчет, если длина 28 байтов и 5 частей? (4 x 5 байтов + 1 x 8 байт? 3 x 6 байтов + 2 x 5 байтов? Или это 2 x 5 байтов + 3 x 6 байт?)

+0

Большое спасибо за ваш ввод, но я буду больше за # символов в файле, а не за количество байтов, которое он принимает в памяти. Я знаю, что они могут быть взаимосвязаны, но я нахожу # путь проще. – Asim

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