C - работа с текстовыми файлами

По сути, я работаю над небольшой программой на C (опять же, это не домашняя работа, а просто эксперименты, пока я не в Uni :)). Моя цель - взять файл, содержащий множество слов, разделенных пробелами, прокрутить файл и всякий раз, когда будет найден пробел, заменить его на \n, создав таким образом большой список слов.

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
/*
 * 
*/
int main(int argc, char** argv) {

char myFile[100];
int i;
FILE *file;
while(argc--) {
    printf("%s\n", *argv++);
}

return 0;
}

Очень просто то, что у меня есть до сих пор, что мне нужно сделать дальше, это взять аргумент и поместить его в массив myFile, чтобы я мог использовать его как fopen, или, может быть, есть другой способ сделать это?

Кроме того, моя идея заключалась в том, чтобы затем прочитать строку в массив через fgets, прокрутить ее по символам, искать ' ', если я ее найду, заменить на \n, а затем переписать эту строку в файл. Звучит ли это разумно, выполнимо?

С уважением,

и спасибо!


person PnP    schedule 27.12.2011    source источник
comment
Вы можете (попробовать) открыть файл прямо из argv: file = fopen(argv[1], "r"); if (file) /* ok! don't forget to fclose(file); */;   -  person pmg    schedule 27.12.2011
comment
Почему шаг «прочитать строку»? Разве вы не можете просто читать файл по одному символу за раз и заменять ' ' на '\n' по мере прохождения?   -  person Carl Norum    schedule 27.12.2011
comment
Я не знал, что есть функция для чтения символов из файла?   -  person PnP    schedule 27.12.2011
comment
Читать о getchar. Затем, когда у вас есть несколько минут, найдите описание стандартной библиотеки (например, приложение K&R) и прочитайте, что доступно: стандартная библиотека c настолько мала и проста, что нет никакого оправдания тому, что вы не знаете, что там находится.   -  person dmckee --- ex-moderator kitten    schedule 27.12.2011
comment
Я знал о getchar, просто не думал, что в данном случае это сработает, спасибо!   -  person PnP    schedule 27.12.2011


Ответы (2)


самый простой способ - открыть файл в бинарном режиме

FILE *fpIn = fopen( argv[1], "rb" );

затем откройте новый файл для записи

FILE* fpOut =  fopen( "tmp.out", "wb" );

и читать байт за байтом из fpIn, используя fgetc, и писать, используя fputc в новый файл

перед записью проверьте, является ли байт пробелом (используйте isspace()), вместо этого напишите '\n'.

затем удалите оригинал и переименуйте tmp.out в argv[1]

person AndersK    schedule 27.12.2011
comment
Спасибо! Высоко ценим Андерс К. - person PnP; 27.12.2011
comment
np, вы также можете проверить наличие нескольких пробелов и просто заменить их одной новой строкой - не знаете, как выглядит ваш файл. - person AndersK; 27.12.2011

Это в значительной степени именно то, что вам предлагается сделать в упражнении K&R 1-12 (вы можете попеременно перенаправлять входной файл на стандартный ввод, если хотите пропустить файловые указатели). Это хорошее упражнение.

К вашему сведению, хороший ресурс для решений K&R: http://clc-wiki.net/wiki/K&R2_solutions

person The111    schedule 27.12.2011