Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > считать файл


Автор: cupper 11.5.2007, 11:46
мне нужно считать текстовый файл вида:
aaa 345
aab 45
aac 754
.....
zzz 234

таким образом чтобы символы считать например в переменну char sim;
а числа в                                                                                        int ch;
цикл вида
Код

while (пока не конец){
       //считать символы в переменную sim
       //считать число в переменную ch
       //далее их используем и по новой
}

Интересует имнно как считать символы с число

Автор: Fazil6 11.5.2007, 11:51
Цитата(cupper @  11.5.2007,  11:46 Найти цитируемый пост)
Интересует имнно как считать символы с число

читаешь строку, по пробелу разбиваешь на 2 и потом вторую преобразуешь в число. Способов несколько от функции atoi до boost::lexical_cast

Автор: Fazil6 11.5.2007, 12:10
Код

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


#define STR_BUF 32 
void main( )
{

    FILE *f(fopen("c:\\test", "r"));
    if(!f) return;

    char buf[STR_BUF + 1];
    while(!feof(f))
    {
        if(!fgets(buf, STR_BUF , f)) 
        {
            if(!feof(f))
            {
                printf("\n%s\n", "ERROR!");
                break;
            }
        }

        char *s = buf;
        char *сh = strchr(s, ' ');
        if(!сh) 
        {
            printf("\n%s\n", "ERROR!");
            break;
        }

        *(сh++) = '\0';
        
        int i = atoi(сh);

        printf("sim = %s   &   ch = %d\n" ,s,i);
    }
    
    
}

Автор: cupper 11.5.2007, 12:27
спасибо

Автор: dizzy1984 11.5.2007, 12:46
Либо так
Код

#include <Stdio.h>

void main()
{
    char szStr[3 + 1];
    int nInt;
    FILE *f = fopen("c:\\123.txt", "rb");
    while (!feof(f))
    {
        fscanf(f, "%3s %d", szStr, &nInt);
        //
    }
    fclose(f);
}

Автор: cupper 11.5.2007, 13:13
если ты скажешь что это еще и вижл студио работает, то ето просто ваще пипец как клева )

Автор: dizzy1984 11.5.2007, 13:29
Проверял на Borland C++ 3.1 и Visual C++ 6.0
кстати забыл добавить строку
Код

if (!f) return;

после
Код

FILE *f = fopen("c:\\123.txt", "rb");

Автор: Promitheus 11.5.2007, 13:41
Цитата(dizzy1984 @  11.5.2007,  12:46 Найти цитируемый пост)
char szStr[3 + 1];


Я конечно понимаю, что черновик, но это вроде бы выделение массива под 3 элемента + 1  smile  А если 4 сразу написать прокатит ?

Файл можно сохранять в текущую папку проекта и открывать тож из текущей папки проекта.
 

cupper,  Я думаю еще много где будет работать даже в Unixe.

Автор: JackYF 11.5.2007, 15:32
Цитата(Promitheus @  11.5.2007,  13:41 Найти цитируемый пост)
А если 4 сразу написать прокатит ?

Естественно smile


<strike>
Цитата(Promitheus @  11.5.2007,  13:41 Найти цитируемый пост)
cupper,  Я думаю еще много где будет работать даже в Unixe. 

уже будет работать и в Юникс. вот только <stdio.h> лучше, все символы прописные.</strike>

Тьфу блин, неправильно прочитал цитату...

Автор: dizzy1984 11.5.2007, 15:35
Цитата(Promitheus @  11.5.2007,  13:41 Найти цитируемый пост)
А если 4 сразу написать прокатит

Такая запись логически вернее 4, т.к показывает смысл размерности массива.
В чистовиках я всегда пишу так же.

А что в юниксах регистр в имени файла является значимым?
И почему уже - работа над библиотекой окончена пол часа назад?

Автор: JackYF 11.5.2007, 15:46
Цитата(dizzy1984 @  11.5.2007,  15:35 Найти цитируемый пост)
А что в юниксах регистр в имени файла является значимым?


В подавляющем большинстве случаев - да. Точно не уверен, что и компилятор ищет заголовочные файл case-sensitive, но зачем делать потенциально неправильно, если можно сделать однозначно верно?



Цитата(dizzy1984 @  11.5.2007,  15:35 Найти цитируемый пост)
И почему уже - работа над библиотекой окончена пол часа назад?

Да блин, заглючило меня... Уже зачеркнул ту часть моего поста.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)