Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2011, 18:49   #1
fort-_-minor
46KSS
Пользователь
 
Аватар для fort-_-minor
 
Регистрация: 26.07.2010
Сообщений: 58
По умолчанию компиляция

Доброго времени суток, Господа! помогите пожалуйста откомпилировать!
Задание такое:
Разработать статистическую библиотеку на языке С для работы с файлами формата СSV.
Должны быть реализованы 3 функции:
/*читает одну строку из файла ввода f; подразумевается что строки во вводе оканчиваются символами \r, \n, \r\n или EOF.
Возвращает указатель на строку (символы конца русской строки удаляются) или NULL, если достигнут EOF. Строки могут иметь произвольную длинну; возвращяется NULL, если превышен резерв памяти, строки рассматриваются как память, доступная только для чтения; для сохранения или изменения содержимого вызывающая сторона должна сделать копию. */
char *csvgetline (FILE *f);

/*Поля нумеруются начиная с 0. Возвращает n-e поле из последней строки, прочитанной csvgetline; возвращает NULL, если n отрицательно или лежит за последним полем, поля разделяются запятыми. Поля могут быть заключены в двойные кавычки, эти кавычки убираются; внутри двойных кавычек запятая не является разделителем, а пара символов "" заменяется на ". В полях, не ограниченных кавычками, кавычки рассматриваются как обычные символы, может быть произвольное количество полей любой длинны; возвращает NULL, если превышается резерв памяти, поля рассматриваются как память, доступная только для чтения; для сохранения или изменения содержимого вызывающая сторона должна сделать копию, при вызове до csvgetline поведение не определено.
*/
char *csvfield (int n);

/* возвращает количество полей в последней строке, прочитанной csvgetline. при вызове до csvgetline поведение не определено. */
int csvnfield (void);
вот код на с++!
Код:
#include <stdafx.h>
#include <iostream>
using namespace std;
class Csv { // читает и разбирает CSV
// пример ввода: "LIT, 86. 25, "11/4/1998",
"2:19РМ", +4. 0625
 public:
Csv(istream& fin = cin, string sep = ",") : 
fin(fin), fieldsep(sep) {}
 int getline(string&);
string getfield(int n);
 int getnfieldO const { return nfield; }
private:
 istream& fin; // указатель на файл ввода
 string line; // вводимая строка
vector<string> field; // строки полей
 int nfield; // количество полей
string fieldsep; // символы разделителей
 int split();
 int endofline(char);
 int advplain(const string& line, 
string& fid, int);
 int advquoted(const string& line, 
 string& fid, int); };
 // getline: получает одну строку,
// по мере необходимости 
наращивает размер
 int Csv::getline(string& str)
 {
 char c;
 for (line = ""; fin.get(c) && !endofline(c); )
line += c; split(); str = line; return !fin.eof(); 
}
// endofline: ищет и удаляет
 \r', \n, \r\n или EOF
 int Csv::endofline(char с)
{
 int eol;
eol = (c==Ar' || c=='\n');
 if (с == V) { , fin.get(c); if
 (!fin.eof() && с != '\n',)
 fin.putback(c); 
// слишком много прочитали >
 return eol; 
}
 А вот как выглядит новая версия функции split: 
 // split: разделяет строку на поля
 int Csv::split()
 {
 string fid;
 int i, j;
nfield = 0;
  if (line.lengthO == 0)
return 0; i = 0;
 do 
{
if (i < line.length()
&& line[i] == '".')
 j = advquoted(line, fid, ++i);
 // пропуск кавычки else
 j = advplain(line, fid, i);
if (nfield >= field.size())
 field.push^back(fld);
 else
 field[nfield] = fid; nfield++; i = j + 1;
 }
 while (j < line.length());
 return nfield; 
 }
 // advquoted: для полей, 
        
заключенных в кавычки;
 // возвращает индекс следующего разделителя
 int Csv::advquoted(const string& s, string& fid, int i)
 {
 int j;
 fid = "";
 for (j = i; j < s.length(); j++) 
 {
 if (S[j] == "&& s[++j] != ") 
 {
 int k = s.find_first_of(fieldsep, j);
 if (k > s.length())
 // разделитель не найден
 k = s.length(); for (k -= j; k-- > 0; )
 fid += s[j++]; 
 break;
 }
 // advplain: для полей, не заключенных в кавычки,
// возвращает индекс следующего разделителя 
int Csv::advplain(const strings s, strings fid, int i) 
 
{
  int j;
 j = s.find_first_of(fieldsep, i);
 // поиск разделителя if (j > s.lengthO)
 // разделитель не найден
 j = s.lengthO; fid = string(s, i, j-i); return j;
 }
 И снова, как и в предыдущей версии, Csv::getfield абсолютно тривиальна, a Csv: :getnfield настолько коротка, что воплощена прямо в описании класса. 
// getfield: возвращает n-e поле string
 Csv::getfield(int n) {
 if (n < 0 n >= nfield)
 return ""; else
 return field[n]; 
}
спасибо!
fort-_-minor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
компиляция ГришаК Компоненты Delphi 3 07.06.2010 13:17
компиляция hasana Паскаль, Turbo Pascal, PascalABC.NET 14 16.05.2010 15:32
компиляция DarK_NighT Общие вопросы Delphi 1 25.03.2009 13:18
компиляция Рамик Помощь студентам 6 14.03.2009 16:07
Компиляция xGroupers Общие вопросы Delphi 1 24.03.2008 11:57