LINUX.ORG.RU

Чтение файла в переменные

 


0

1

Доброго вечера! Пытаюсь считать файл такого формата:

content//welcome.jpg
1
-1
1
-1
content//logo.png
0.8
-0.8
0.8
0.4
такой вот код:

struct Image
{
	//float**TextureCoordinats;
	float**VertexCoordinats;
	unsigned int*IndexTexture;
	std::string *Name;
	int *number;
};

std::ifstream in("welcome coordinats.txt");
	Image *im = new Image();
	if (in.is_open())
	{
		while (in >> im->Name)
		{
			//new_operations.push_back(Operation(sum, rate));
		}
	}
	in.close();
Ошибка в строке while (in >> im->Name) Ошибка C2679 бинарный «>>»: не найден оператор, принимающий правый операнд типа «std::string *» (или приемлемое преобразование отсутствует)

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
     FILE * file = fopen("conf.txt","r");

     char   string[1024];
     int    number;
     float  realnum;

    fseek(file,0,SEEK_END);
    size_t filesize = ftell(file);
    fseek(file,0,SEEK_SET);


     while(filesize != ftell(file))
     {
         if(fscanf(file,"%d",&number) == 1)
         {
            printf("[INT] -> %d\n",number);

         }else if(fscanf(file,"%f",&realnum) == 1)
         {
            printf("[FLOAT] -> %f\n",realnum);

         }else if(fscanf(file,"%1023s",string) == 1)
         {
            printf("[STR] -> %s\n",string);
            memset(string,0,1024);
         }
     }

     fclose(file);
}

dron@gnu:~$ gcc -std=c99 ggg.c
dron@gnu:~$ ./a.out 
[STR] -> content//welcome.jpg
[INT] -> 1
[INT] -> -1
[INT] -> 1
[INT] -> -1
[STR] -> content//logo.png
[INT] -> 0
[FLOAT] -> 0.800000
[INT] -> 0
[FLOAT] -> 0.800000
[INT] -> 0
[FLOAT] -> 0.800000
[INT] -> 0
[FLOAT] -> 0.400000
dron@gnu:~$ 

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от utf8nowhere

Там и - у 0.8 потерялось ))) Написал по быстрому каку, бросил и убежал =). Надо проверять чуть по другому, но концепция ясна. Там до точки считает как обычное число. А потом после точки как флоат.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от utf8nowhere
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
     FILE * file = fopen("conf.txt","r");

     char   string[1024];
     int    number,fakenum;
     float  realnum;

    fseek(file,0,SEEK_END);
    size_t filesize = ftell(file);
    fseek(file,0,SEEK_SET);


     while(ftell(file) != filesize)
     {
        if(fscanf(file,"%s",string)==1)
        {
            if(sscanf(string,"%d.%d",&number,&fakenum) == 2)
            {
                sscanf(string,"%f",&realnum);
                printf("[FLOAT] -> %f\n",realnum);

            }else if(sscanf(string,"%d",&number) == 1)
            {
                printf("[INT] -> %d\n",number);
            }else{
                printf("[STR] -> %s\n",string); 
            }
            memset(string,0,1024);
        }
     }

     fclose(file);
}

только запись типа .8 будет как строка.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Печалька.

Мне можно, я не программист.

У Вас всё хорошо

Нет конечно, как минимум мне не показали как надо. =)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Мне можно, я не программист.

Это многое объясняет. Если Вам интересно как такие вещи пишутся, и в чем масса проблем - через пару дней могу скинуть как бы я написал. В силу многих причин - занят трошки at the moment. Только задачу уточните - мы ограничены «plain C», или всё таки плюсовое решение нужно?

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

Сишечку желательно в плюсах слишком много батареек и проблема ТС уже решена так что мы тут уже сами по себе «флудим». Никто тут никого не торопит, как будет время и желание. =)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Сишечку желательно

Ок.

в плюсах слишком много батареек

За приделы STL выходить не планировал, точнее streams part of it

проблема ТС уже решена

Настолько «костыльно», что слёзы наворачиваются. Нельзя так.

bugfixer ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Сишечку желательно

Посмотрел я на man 3 getline и решил не тратить время понапрасну: там в конце есть пример как правильно и эффективно построчно читать файл. Можно немного улучшить обработку ошибок (ловить EINTR, а также различать EOF и реальные IO errors), но в целом - сильно лучше не сделать. А а когда строка «в руках» - дальше всё просто: memchr(... '.' ...) или strspn(... ".eE") (если «1e23» etc обрабатывать надо) чтобы отличить int and float, а затем strtol() и strtof() дабы распарсить. Сверху приправить обработкой parsing errors по вкусу / согласно объективной реальности/спекам / уровню параноидальности, и «вуаля». Я уверен - Вы разберетесь (если Вам конечно всё ещё интересно, в чём я сильно сомневаюсь) =)

bugfixer ★★★★★
()