LINUX.ORG.RU

[C] Ъ считывание из файла

 


0

3

Есть файл вида:

12.2 4
 33.3  5.6
1.33    3.2
 2323  45.1
  2131 3.432
 3234   3323
3242     3423
 324324 43423

Нужно считать из него все числа в два массива (в первый массив числа первого столбца, во второй — второго). Причём если в строке что-то не так (присутствует что-то кроме двух чисел или же не хватает цифры), выводить ошибку. Как такое делают Ъ? А то частенько приходится делать подобное и каждый раз получается уникальный велосипед.

Надо учитывать то, что вместо точки может использоваться запятая, а также то, что могут быть как Unix, так и Dos концы строки. Хотя насчёт запятой не обязательно.

★★★★★

Ъ пишут парсер на yacc, либо регексп сочиняют (-lpcre). Что бы не делать, лишь бы на голых сях со строками не работать.

mv ★★★★★
()

что-нибудь такое

sscanf(str, «%f», &a)

Olegymous ★★★
()

сначала нужно весь файл прочитать в отдельный массив, что-то типа такого

void readFile(FILE *f, char (*res)[50])
{
	for(int i=0; !feof(f); ++i)
		fgets(res[i],50,f);
}

ну а потом можно хоть регекспом этот массив проходить в цикле

Aid_
()
Ответ на: комментарий от Aid_

сначала нужно весь файл прочитать в отдельный массив

При Сталине таких «программистов» к стенке ставили.

mv ★★★★★
()
Ответ на: комментарий от mv

>> > сначала нужно весь файл прочитать в отдельный массив

При Сталине таких «программистов» к стенке ставили

На кол его !

MikeDM ★★★★★
()
Ответ на: комментарий от mv

> При Сталине таких «программистов» к стенке ставили.
А сейчас, к сожалению, даже не банят

hdfan2
()

Хотя насчёт запятой не обязательно.

тогда так

while (fgets(buf, buf_size, f))
{
   if (sscanf(buf, "%lf%lf", &a, &b) == 2) {
      m1[i] = a;
      m2[i] = b;
      ++i;
   }
}
Reset ★★★★★
()
Ответ на: комментарий от Aid_

да что не так-то?

Текстовые файлы полностью в память для последующей обработки читают только враги народа.

mv ★★★★★
()
Ответ на: комментарий от mv

хотя да - если файл большой, то памяти убиваться много будет.. да и лишнее, можно в этом цикле сразу в массив чисел записывать.. 8 утра, с Новым Годом

Aid_
()

Ъ по системным функциям хренарят. На асме. А лучше на МК сразу.

anonymous
()
Ответ на: комментарий от Aid_

Если с нормальным алгоритмом обработки файла по частям заморачиваться не охота, то для совсем ленивых есть mmap().

mv ★★★★★
()
Ответ на: комментарий от Reset

спасибо! проще, чем я думал.

я так понял, ошибку вот так ловить:

while (fgets(buf, buf_size, f))
{
   if (sscanf(buf, "%lf%lf", &a, &b) == 2) {
      m1[i] = a;
      m2[i] = b;
      ++i;
   } else {
      //ЕГГОГ
   }
}

верно?

Obey-Kun ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.