Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с числами из файла на си, работа с числами из файла на си 
:(
    Опции темы
voffka1917
Дата 17.9.2007, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.9.2007

Репутация: нет
Всего: нет



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

4, 3, 1, 3, 3, 6
6, 6, 5, 2, 4, 7
4, 9, 4, 3, 3, 8, 7
9, 2, 4, 9, 8, 1, 4, 2, 1, 9, 6, 6, 5, 9, 6
3, 3, 7, 3, 2, 7, 8, 5, 8, 9, 2, 1, 1, 3, 3 
10000,5000,1000,0


- кидает все числа с одной строки на stack, остальные на новые stack-и
- потом записывает числа в определённом порядке (это потом)


я в си новичок

написал уже:
Код


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

#define dateiname "input1.data"

char eingabe;
FILE *datei;

int abfrage (void);
int speichern (void);


int main (void)
{
    abfrage();
    return 0;
}

int abfrage (void)
{
    //printf("Wie heisst die Datei die Sie oeffnen moechten? (name.data): ");
    //scanf("%s",dateiname);
    //fflush(stdin);
        
    int c;
    int zahl;
    
    datei = fopen(dateiname, "r");
    
    if (datei != NULL)
    {
        printf("Die Datei existiert :)\n");
        i=0;
        while( (c=fgetc(datei)) != EOF)
        {
            if (c != ',')
            {
                sscanf(datei, "%d", &zahl);
                printf("%d\n", &zahl);            
            }
        }
        
        fclose(datei);
            
    }

    else
    {
        printf("Die Datei gibt es nicht! :(\n");
        abfrage();
    }

    return 0;
}



вот только в строчке

Код

if (c != ',')
{
sscanf(datei, "%d", &zahl);
printf("%d\n", &zahl);            
}


не знаю, как мне из прочитанного "int" получить чтобы можно было дальше с ним работать :(

надеюсь на скорую помощь smile
PM MAIL   Вверх
JackYF
Дата 17.9.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(voffka1917 @  17.9.2007,  15:26 Найти цитируемый пост)
не знаю, как мне из прочитанного "int" получить

ты его уже получил после

Цитата(voffka1917 @  17.9.2007,  15:26 Найти цитируемый пост)
sscanf(datei, "%d", &zahl);

переменная zahl какого типа?

и что-то странные у тебя названия переменных, немецкий напоминают



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
voffka1917
Дата 17.9.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.9.2007

Репутация: нет
Всего: нет



zahl типа int

названия немецкие ;)

а как тогда я увижу, что мне выдаётся число, а то printf выдаёт непонятно что :(

Добавлено через 5 минут и 6 секунд
просто в java привык с system.out.println на результаты смореть
PM MAIL   Вверх
Dov
Дата 17.9.2007, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



так нужно:
Код

printf("%d\n", zahl); 





--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
voffka1917
Дата 17.9.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.9.2007

Репутация: нет
Всего: нет



Цитата(Dov @ 17.9.2007,  16:20)
так нужно:
Код

printf("%d\n", zahl); 

так тоже чтото несуразное показывает :-(

Добавлено через 3 минуты и 22 секунды
c &:
Код

-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116
-1077194116


без &:
Код

134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457
134514457


Добавлено через 6 минут и 37 секунд
пишу в eclipse на opensuse 10.2 с gcc
может в компайлере пробема
PM MAIL   Вверх
Mihhail
Дата 17.9.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.9.2007

Репутация: нет
Всего: 9



Почему sscanf, а не fscanf?
Сравни:
 int sscanf(const char *buffer, const char *format[, address, ...]);
 int fscanf(FILE *stream, const char *format[, address, ...]);

К тому же присмотрись к порядку действий:
     Считывается символ "4" в переменную с : c=fgetc(datei);
     Далие в zahl считывается уже не число, а запятая ","

Добавлено в 21:12
Предлагаю упростить:
Код

        while( (c=fgetc(datei)) != EOF)
        {
            if (c != ',') printf( "%с", с );            
                else printf( "\n" );            
        }


Это сообщение отредактировал(а) Mihhail - 17.9.2007, 17:04
PM MAIL WWW   Вверх
voffka1917
Дата 17.9.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.9.2007

Репутация: нет
Всего: нет



Цитата(Mihhail @ 17.9.2007,  16:56)
К тому же присмотрись к порядку действий:
     Считывается символ "4" в переменную с : c=fgetc(datei);
     Далие в zahl считывается уже не число, а запятая ","

а почему в zahl считывается ";", если в if сказано что чтение без запятой???

Добавлено через 7 минут и 45 секунд
Цитата(Mihhail @ 17.9.2007,  16:56)
Добавлено в 21:12
Предлагаю упростить:
Код

        while( (c=fgetc(datei)) != EOF)
        {
            if (c != ',') printf( "%с", с );            
                else printf( "\n" );            
        }




так функция будет выдавать правильно считанный результат
но мне нужно чтобы мне эта функция отдавала int, а не char
PM MAIL   Вверх
Earnest
Дата 17.9.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(voffka1917 @  17.9.2007,  18:03 Найти цитируемый пост)
а почему в zahl считывается ";", если в if сказано что чтение без запятой??? 

Это тебе только так кажется. А на самом деле ты проверяешь символ, который уже прочитал из буфера, а fscanf читает уже со следующего... 



--------------------
...
PM   Вверх
Mihhail
Дата 17.9.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 13.9.2007

Репутация: нет
Всего: 9



Цитата
 while( (c=fgetc(datei)) != EOF)
        {
            if (c != ',')
            {
                sscanf(datei, "%d", &zahl);
                printf("%d\n", &zahl);            
            }
        }

Считываем символ (при этом указатель о откратом файле смещается на следующий), если он не равен ',' выполняем считывание int значения и его печать. В zahl попадает код символа ','.
PM MAIL WWW   Вверх
voffka1917
Дата 17.9.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.9.2007

Репутация: нет
Всего: нет



Цитата(Mihhail @ 17.9.2007,  17:13)
Цитата
 while( (c=fgetc(datei)) != EOF)
        {
            if (c != ',')
            {
                sscanf(datei, "%d", &zahl);
                printf("%d\n", &zahl);            
            }
        }

Считываем символ (при этом указатель о откратом файле смещается на следующий), если он не равен ',' выполняем считывание int значения и его печать. В zahl попадает код символа ','.

и как можно это исправить? очищать буфер?

Добавлено через 9 минут и 3 секунды
я полностью убрал if и заработало smile
но теперь есть тиакая проблема, что 1й символ в файле перепрыгивается, а последний повторяется 2жды

как мне прочитать 1й символ, чтобы не мешать потоку в "while"?
PM MAIL   Вверх
Earnest
Дата 17.9.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Вообще все переделать.
Прочитать в буфер строку целиком.
Разбить ее на токены, разделенные запятой.
Каждую подстроку конвертировать в int.

(Не очищать буфер, а возвращать туда символ. В принципе можно, но это какая-то левая метода, причем не очень эффективная.)


--------------------
...
PM   Вверх
voffka1917
Дата 17.9.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.9.2007

Репутация: нет
Всего: нет



я всё же сделал с передвижением назад, т.к не знаю как сделать построчно...

Код

int tmp=0;
        while( (c=fgetc(datei)) != EOF)
        {
            if (tmp == 0)
            {
                ungetc(c,datei);
            }
            
            if (c == '\n')
            {
                printf("\n");
            }
            
            tmp++;
            
            if (fscanf(datei, "%d", &zahl) != EOF) 
            {
                printf("%d ", zahl);
            }
        }
    

вроде работает, вот только вопрос созрел, а как же с запятыми, или же они игнорируются автоматом?


Это сообщение отредактировал(а) voffka1917 - 17.9.2007, 19:38
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.