Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с файлом
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Clerick
Здравствуйте. Подскажите как сделать? Читает текстовый файл, в котором написана таблица, строки соответствуют строкам , столбцы разделены (разделителем-запятая), если значение цифра (целое или дробное), то она оставляется, если значение слово, то записывает его в массив и вместо слова ставит номер значения из этого массива. Для каждого столбца свой массив.
Начал реализовывать, но столкнулся с проблемой как считать слово и заменить его на номер в другом массиве, а в другой его записать.

#include <stdio.h>
#include <afx.h>
#include <conio.h>
#include <ctype.h>
#include <tchar.h>

FILE *fi,*fo;
int nline=0;
int count=0;
PSTR gpPos;

void main(){
char fname[]="test2.txt";
char fname2[]="output.txt";
// printf("\nVvedite imja fhodnogo faila: ");
// scanf("%s",&fname);

if((fi=fopen(fname,"r"))==NULL)
{
printf("\nOshibka otkrytija vhodnogo faila!");
getch();
exit(0);
}
if((fo=fopen(fname,"w"))==NULL)
{
printf("\nOshibka otkrytija vhodnogo faila!");
getch();
exit(0);
}

char c;
int elem[119];
while(!feof(fi))
{
c=fgetc(fi);
count++;
if ((c=='\n')||(c==EOF))
{
nline++;
elem[nline]=count;
count=0;
}
}

char line[120]="";
char *result;
fseek (fi, 0L, SEEK_SET);
int k=0;
while (!feof(fi))
{
result=fgets(line,elem[k],fi);
gpPos=(PSTR)result;
int n=sizeof(gpPos);
for(;;)
{ gpPos++;
int j=0;
char m[20];
if isalpha(gpPos)
{
for(;;){
gpPos++;
if (gpPos==',')
break;
}
m[j]=(char)gpPos;
gpPos=PSTR(j);
}
fputc(m[j],fo);
}
k++;
}
fclose(fi);
fclose(fo);
}

Пример входного файлаНажмите для просмотра прикрепленного файла
volvo
Зачем ты работаешь посимвольно?

Я бы читал строку полностью из файла тем же fgets-ом, потом разбивал бы ее на токены с помощью strtok (у тебя ж разделяются все элементы запятой? Вот и разбивай по запятым). Получил очередной токен - попробовал перевести его в вещественное число. Не получилось - значит строка, делаешь со строкой то, что тебе надо, записываешь в массив (или сначала ищешь, может эта строка уже в массиве есть), а в другой массив пишешь индекс...
Clerick
А что имеется в виду под перевести в вещественное число?
volvo
    double f;
char *s = "http";
if(sscanf(s, "%lf", &f) == 0)
{
printf("Error\n");
}
else
{
printf("%8.4lf\n", f);
}

В случае "http" функция sscanf вернет 0, и ты понимаешь, что там ошибка, значит - была строка. Если в s записать, скажем, "123.434", то это число корректно прочитается и выполнение пойдет по другой ветке...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.