Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

задача в си (не си++)

207  
moricons Х@кер-недоучка17.09.07 13:22
moricons
17.09.07 13:22 
мне нужно написать прогу, которая
- читает текстовой файл
прим.
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" получить чтобы можно было дальше с ним работать :(
надеюсь на скорую помощь :)

- Мы делаем, что умеем,Мы отдаем, что имеем- Наша работа - во тьме.
#1 
Murr коренной житель17.09.07 16:33
Murr
NEW 17.09.07 16:33 
в ответ moricons 17.09.07 13:22
int zahl;
sscanf(datei, "%d", &zahl);
не знаю, как мне из прочитанного "int" получить чтобы можно было дальше с ним работать :(
------
??? - значение лежит в zahl - что тебе с ним делать - думай сам.
#2 
Murr коренной житель17.09.07 16:35
Murr
NEW 17.09.07 16:35 
в ответ Murr 17.09.07 16:33
Опсс... пропустил... вроде не sscanf(), a fscanf() - ты же с файлом работаешь...
#3 
moricons Х@кер-недоучка17.09.07 17:44
moricons
NEW 17.09.07 17:44 
в ответ Murr 17.09.07 16:35
это я исправил, но теперь есть проблема, что 1й символ в файле перепрыгивается, а последний повторяется 2жды
может быть построчно считывать файл и делить на части?! но вот я не знаю как это сделать :(
- Мы делаем, что умеем,Мы отдаем, что имеем- Наша работа - во тьме.
#4 
Murr коренной житель17.09.07 21:13
Murr
NEW 17.09.07 21:13 
в ответ moricons 17.09.07 17:44
но теперь есть проблема
------
Хи-хи... проблема...
Тебе, собственно, и дали задачу, чтобы ты понял как именно это надо делать.
но вот я не знаю как это сделать :(
------
Попробуй немного подумать. Если думать придется долго - выбери какой-нибудь другой курс...
#5 
AlexNek старожил18.09.07 00:37
AlexNek
NEW 18.09.07 00:37 
в ответ moricons 17.09.07 17:44
Ненавижу scanf, c ним всегда какие то проблемы.
Читай по строкам, затем сканируй строку, находи цифры и все остальное как разделители. Когда научишь прогу число в символьном виде получать, пользуй atoi.
#6 
moricons Х@кер-недоучка18.09.07 10:08
moricons
NEW 18.09.07 10:08 
в ответ Murr 17.09.07 21:13
я вот и выбрал:
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);
}
}


т.к не знаю как сделать построчно

- Мы делаем, что умеем,Мы отдаем, что имеем- Наша работа - во тьме.
#7 
Murr коренной житель18.09.07 12:14
Murr
NEW 18.09.07 12:14 
в ответ AlexNek 18.09.07 00:37
Ненавижу scanf, c ним всегда какие то проблемы.
------
Никаких проблем, всегда работает... с корректной строкой.
затем сканируй строку
------
Ага... Посоветуй еще создать машину состояний автомата распознающего предложенный язык... что есть правильно, но пока недоступно в виду уровня возможностей.
#8 
Murr коренной житель18.09.07 12:19
Murr
NEW 18.09.07 12:19 
в ответ moricons 18.09.07 10:08
int tmp=0;
while( (c=fgetc(datei)) != EOF)
{
if (tmp == 0)
{
ungetc(c,datei);
}
if (c == '\n')
{
printf("\n");
}
tmp++;
------
Потенциально некорректная операция. Подумай сам - что будет, если количество чисел в файле больше чем вмещает int?
И еще - нет совершенно никакой необходимости оперировать с fgetc/ungetc - fscanf вполне достаточно.
#9 
  Chipolino местный житель18.09.07 15:38
NEW 18.09.07 15:38 
в ответ AlexNek 18.09.07 00:37
В ответ на:
Когда научишь прогу число в символьном виде получать, пользуй atoi.

за atoi пальцы отрубать надо
#10 
AlexNek старожил18.09.07 18:45
AlexNek
NEW 18.09.07 18:45 
в ответ Murr 18.09.07 12:14
-Никаких проблем, всегда работает... с корректной строкой.
строка, к сожалению, далеко не всегда корректная.
Подробности правда забыл, но помню специально хотел в одной проге сканф пользовать, так день возился с ним, но в конце концов выбросил нафиг и записал на нем большой крест.
--Посоветуй еще создать машину состояний автомата распознающего предложенный язык...
ну если сканф не работал то нужна же какая-то альтернатива.
#11 
AlexNek старожил18.09.07 18:56
AlexNek
NEW 18.09.07 18:56 
в ответ Chipolino 18.09.07 15:38
-за atoi пальцы отрубать надо
А можно подробнее и про альтернативу пожалуйста
#12 
Murr коренной житель18.09.07 19:21
Murr
NEW 18.09.07 19:21 
в ответ AlexNek 18.09.07 18:45
Подробности правда забыл, но помню специально хотел в одной проге сканф пользовать, так день возился с ним, но в конце концов выбросил нафиг
------
Т.е. - не справился с написанием строки-формата и пошел делать аналогичную имплементацию "руками"...
Вывод - матчасть учить надо.
#13 
Murr коренной житель18.09.07 19:24
Murr
NEW 18.09.07 19:24 
в ответ AlexNek 18.09.07 18:56
А можно подробнее и про альтернативу пожалуйста
------
Разумеется - "%d"...
#14 
AlexNek старожил18.09.07 19:32
AlexNek
NEW 18.09.07 19:32 
в ответ Murr 18.09.07 19:21
А чего там не справлятся когда там всего 2 символа было
Дурел он просто, то числа не те вводил, то с концом файла прикалывал. А если еще в файл буковки к циферкам дописать, то вообще веселая жизнь начинается.
#15 
moricons Х@кер-недоучка19.09.07 12:07
moricons
NEW 19.09.07 12:07 
в ответ Murr 18.09.07 12:19
не знаю что ты имеешь ввиду, с fscanf у меня не получается
ungetc надо чтоб считывалось 1е число после "\n"
предложи свой вариант
- Мы делаем, что умеем,Мы отдаем, что имеем- Наша работа - во тьме.
#16 
Программист посетитель19.09.07 15:01
NEW 19.09.07 15:01 
в ответ moricons 17.09.07 13:22
В ответ на:
//printf("Wie heisst die Datei die Sie oeffnen moechten? (name.data): ");
//scanf("%s",dateiname);
//fflush(stdin);

Это С++ :)
#17 
AlexOtt посетитель21.09.07 13:34
AlexOtt
NEW 21.09.07 13:34 
в ответ moricons 17.09.07 13:22
Учите матчасть (стандартную библиотеку) - в ней есть все нужные функции для парсинга
Вот так получится более просто и понятно
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXBUF 200
int main(int argc, char** argv) {
FILE* file;
char buf[MAXBUF];
if((file=fopen("1.dat","r")) == NULL)
return 1;
while(fgets(buf,MAXBUF-1,file) != NULL ) {
char *t;
if(buf[strlen(buf)-1] == '\n')
buf[strlen(buf)-1]='\0';
printf("read %s\n",buf);
t=strtok(buf,",");
while(t!=NULL) {
long number=atol(t);
printf("parsed=%s number=%d\n",t,number);
t=strtok(NULL,",");
}

}
fclose(file);
return 0;
}
#18