Login
задача в си (не си++)
207
NEW 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" получить чтобы можно было дальше с ним работать :(
надеюсь на скорую помощь :)
- Мы делаем, что умеем,Мы отдаем, что имеем- Наша работа - во тьме.
NEW 17.09.07 16:33
in Antwort moricons 17.09.07 13:22
int zahl;
sscanf(datei, "%d", &zahl);
не знаю, как мне из прочитанного "int" получить чтобы можно было дальше с ним работать :(
------
??? - значение лежит в zahl - что тебе с ним делать - думай сам.
sscanf(datei, "%d", &zahl);
не знаю, как мне из прочитанного "int" получить чтобы можно было дальше с ним работать :(
------
??? - значение лежит в zahl - что тебе с ним делать - думай сам.
NEW 17.09.07 16:35
in Antwort Murr 17.09.07 16:33
Опсс... пропустил... вроде не sscanf(), a fscanf() - ты же с файлом работаешь...
NEW 17.09.07 17:44
in Antwort Murr 17.09.07 16:35
это я исправил, но теперь есть проблема, что 1й символ в файле перепрыгивается, а последний повторяется 2жды
может быть построчно считывать файл и делить на части?! но вот я не знаю как это сделать :(
может быть построчно считывать файл и делить на части?! но вот я не знаю как это сделать :(
- Мы делаем, что умеем,Мы отдаем, что имеем- Наша работа - во тьме.
NEW 17.09.07 21:13
in Antwort moricons 17.09.07 17:44
но теперь есть проблема
------
Хи-хи... проблема...
Тебе, собственно, и дали задачу, чтобы ты понял как именно это надо делать.
но вот я не знаю как это сделать :(
------
Попробуй немного подумать. Если думать придется долго - выбери какой-нибудь другой курс...
------
Хи-хи... проблема...
Тебе, собственно, и дали задачу, чтобы ты понял как именно это надо делать.
но вот я не знаю как это сделать :(
------
Попробуй немного подумать. Если думать придется долго - выбери какой-нибудь другой курс...
NEW 18.09.07 00:37
in Antwort moricons 17.09.07 17:44
Ненавижу scanf, c ним всегда какие то проблемы.
Читай по строкам, затем сканируй строку, находи цифры и все остальное как разделители. Когда научишь прогу число в символьном виде получать, пользуй atoi.
Читай по строкам, затем сканируй строку, находи цифры и все остальное как разделители. Когда научишь прогу число в символьном виде получать, пользуй atoi.
NEW 18.09.07 10:08
in Antwort 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);
}
}
т.к не знаю как сделать построчно
- Мы делаем, что умеем,Мы отдаем, что имеем- Наша работа - во тьме.
NEW 18.09.07 12:14
in Antwort AlexNek 18.09.07 00:37
Ненавижу scanf, c ним всегда какие то проблемы.
------
Никаких проблем, всегда работает... с корректной строкой.
затем сканируй строку
------
Ага... Посоветуй еще создать машину состояний автомата распознающего предложенный язык... что есть правильно, но пока недоступно в виду уровня возможностей.
------
Никаких проблем, всегда работает... с корректной строкой.
затем сканируй строку
------
Ага... Посоветуй еще создать машину состояний автомата распознающего предложенный язык... что есть правильно, но пока недоступно в виду уровня возможностей.
NEW 18.09.07 12:19
in Antwort 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 вполне достаточно.
while( (c=fgetc(datei)) != EOF)
{
if (tmp == 0)
{
ungetc(c,datei);
}
if (c == '\n')
{
printf("\n");
}
tmp++;
------
Потенциально некорректная операция. Подумай сам - что будет, если количество чисел в файле больше чем вмещает int?
И еще - нет совершенно никакой необходимости оперировать с fgetc/ungetc - fscanf вполне достаточно.
18.09.07 15:38
за atoi пальцы отрубать надо
in Antwort AlexNek 18.09.07 00:37
В ответ на:
Когда научишь прогу число в символьном виде получать, пользуй atoi.
Когда научишь прогу число в символьном виде получать, пользуй atoi.
за atoi пальцы отрубать надо
NEW 18.09.07 18:45
in Antwort Murr 18.09.07 12:14
-Никаких проблем, всегда работает... с корректной строкой.
строка, к сожалению, далеко не всегда корректная.
Подробности правда забыл, но помню специально хотел в одной проге сканф пользовать, так день возился с ним, но в конце концов выбросил нафиг и записал на нем большой крест.
--Посоветуй еще создать машину состояний автомата распознающего предложенный язык...
ну если сканф не работал то нужна же какая-то альтернатива.
строка, к сожалению, далеко не всегда корректная.
Подробности правда забыл, но помню специально хотел в одной проге сканф пользовать, так день возился с ним, но в конце концов выбросил нафиг и записал на нем большой крест.
--Посоветуй еще создать машину состояний автомата распознающего предложенный язык...
ну если сканф не работал то нужна же какая-то альтернатива.
NEW 18.09.07 18:56
in Antwort Chipolino 18.09.07 15:38
NEW 18.09.07 19:21
in Antwort AlexNek 18.09.07 18:45
Подробности правда забыл, но помню специально хотел в одной проге сканф пользовать, так день возился с ним, но в конце концов выбросил нафиг
------
Т.е. - не справился с написанием строки-формата и пошел делать аналогичную имплементацию "руками"...
Вывод - матчасть учить надо.
------
Т.е. - не справился с написанием строки-формата и пошел делать аналогичную имплементацию "руками"...
Вывод - матчасть учить надо.
NEW 18.09.07 19:24
in Antwort AlexNek 18.09.07 18:56
NEW 18.09.07 19:32
in Antwort Murr 18.09.07 19:21
А чего там не справлятся когда там всего 2 символа было
Дурел он просто, то числа не те вводил, то с концом файла прикалывал. А если еще в файл буковки к циферкам дописать, то вообще веселая жизнь начинается.
Дурел он просто, то числа не те вводил, то с концом файла прикалывал. А если еще в файл буковки к циферкам дописать, то вообще веселая жизнь начинается.
NEW 19.09.07 12:07
in Antwort Murr 18.09.07 12:19
не знаю что ты имеешь ввиду, с fscanf у меня не получается
ungetc надо чтоб считывалось 1е число после "\n"
предложи свой вариант
ungetc надо чтоб считывалось 1е число после "\n"
предложи свой вариант
- Мы делаем, что умеем,Мы отдаем, что имеем- Наша работа - во тьме.
NEW 19.09.07 15:01
Это С++ :)
in Antwort moricons 17.09.07 13:22
В ответ на:
//printf("Wie heisst die Datei die Sie oeffnen moechten? (name.data): ");
//scanf("%s",dateiname);
//fflush(stdin);
//printf("Wie heisst die Datei die Sie oeffnen moechten? (name.data): ");
//scanf("%s",dateiname);
//fflush(stdin);
Это С++ :)
NEW 21.09.07 13:34
in Antwort 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;
}
Вот так получится более просто и понятно
#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;
}