Перенаправление стандартного ввода-вывода (XCODE) - C (СИ)
Формулировка задачи:
Здравствуйте, товарищи, дамы и господа. Изучаю сейчас С по одной очень занимательной книжуле: "Изучаем программирование на Си" (Head First). Всё было прекрасно до того момента, как я столкнулся с одним пустяковым задаием. Трудности у меня возникли с компилятором(я работаю в XCODE а автор в GCC).
Короче говоря, есть у нас вот такой код
Суть в том, что мы задаём с клавиатуры определённую широту, долготу и скорость и выдаёт прога нечто вроде этого {latitude: 56.099998, longtitude: 76.900002, info: '87'}
Задача в том, чтобы данные вводились из файла gpsdata.csv, затем из обрабатывала наша программа и выводила результат в файл output.json
Автор книги делает это так (с помощью операторов < и > и компилятора GCC)
Как мне провернуть подобное с помощью XCODE? Спасайте!
#include <stdio.h>
int main()
{
float latitude;
float longtitude;
char info[80];
int started = 0;
puts("data=[");
while (scanf("%f,%f,%79[^\n]", &latitude, &longtitude, info)==3) {
if (started)
printf(",\n");
else
started = 1;
printf("{latitude: %f, longtitude: %f, info: '%s'}", latitude, longtitude, info);
}
puts("\n]");
return 0;
}Решение задачи: «Перенаправление стандартного ввода-вывода (XCODE)»
textual
Листинг программы
#include <stdio.h> // puts, fopen, fclose, fgetc, fputc
#include <ctype.h> // toupper
void processing(FILE* in, FILE* out)
{
int c;
while( (c = fgetc(in)) != EOF ) {
fputc(toupper(c), out);
}
}
int main(int argc, char* argv[])
{
if( argc != 3 ) {
puts("Usage: geo2json input.csv output.json\n");
return 1;
}
FILE* in = fopen(argv[1], "r");
if( in ) {
FILE* out = fopen(argv[2], "w");
if( out ) {
processing(in, out);
fclose(out);
} else {
puts("Error opening output file!");
}
fclose(in);
} else {
puts("Error opening input file!");
}
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы:
stdio.hдля работы со стандартным вводом-выводом (функцииputs,fopen,fclose,fgetc,fputc)ctype.hдля использования функцииtoupper
- Определяется функция
processing, которая принимает два аргумента типаFILE*:in(входной поток) иout(выходной поток). Внутри функции используется циклwhile, который выполняется до тех пор, пока не достигнут конец файла (EOF).- В каждой итерации цикла считывается символ из входного потока с помощью функции
fgetc - Этот символ преобразуется в верхний регистр с помощью функции
toupper - Преобразованный символ записывается в выходной поток с помощью функции
fputc
- В каждой итерации цикла считывается символ из входного потока с помощью функции
- В функции
mainпроверяется корректность аргументов командной строки. Если аргументов меньше или больше трех, выводится сообщение об ошибке и возвращается код завершения 1.- Если все в порядке, открывается входной файл с помощью функции
fopenи проверяется его открытие. Если файл не может быть открыт, выводится сообщение об ошибке и возвращается код завершения 1. - Если входной файл успешно открыт, открывается выходной файл с помощью функции
fopenи проверяется его открытие. Если файл не может быть открыт, выводится сообщение об ошибке и возвращается код завершения 1. - Если оба файла успешно открыты, вызывается функция
processingс передачей в нее указателей на входной и выходной потоки - После завершения функции
processingзакрывается выходной поток с помощью функцииfclose - Если при открытии выходного файла произошла ошибка, закрывается входной поток с помощью функции
fclose - Если все файлы были успешно закрыты, возвращается код завершения 0
- Если все в порядке, открывается входной файл с помощью функции
- Код завершения программы (возвращаемое значение функции
main) выводится на экран с помощью функцииputs