Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dezman666
1 / 1 / 0
Регистрация: 09.04.2009
Сообщений: 18
#1

Работа с файлами в цикле. - C++

09.04.2009, 16:09. Просмотров 961. Ответов 10
Метки нет (Все метки)

Вообщем у меня стоит задача считать из текстового файла цифры, фаил состоит из ста строк в каждой по двузначной цифре. Мне надо эти цифры перегнать в масив, соответственно будет масив из ста двузначных цифр.

моя реализация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void __fastcall TForm1::N2Click(TObject *Sender)
{ const int len=2;
int r; int i=0;
char line[len];
int mas1[101];
OpenDialog1->FileName = "*.txt";
OpenDialog1->Options << ofPathMustExist
                     << ofFileMustExist;
 
 
if ( OpenDialog1->Execute() )
 {
 
 FILE *file;
 char* file_name = OpenDialog1->FileName.c_str();
 char load_string[10] = "none";
 file = fopen( file_name, "r" );
 
 while (!feof(file))
  {
  fgets( load_string, 10 , file );
  mas1[i]=StrToInt(load_string); i++;
  }
  fclose( file );
  Edit1->Text=mas1[77];
 }
}
Проблема в цикле ваил, это я понимаю, но так как я изучал си в консоле, то с визуальным програмированием у меня проблемы и собственно все что я тут напрограммировал я узнал сегодня. Вот незнаю как выдти из тупика, подскажите плиз.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2009, 16:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с файлами в цикле. (C++):

Работа с текстовыми файлами, внесение структуры в файл, вывод структур из файла в цикле(по одной) - C++
Хочу вывести структуры из файла, похоже что функция &quot;void output()&quot; написана неверно, подскажите как ее написать что бы она выводила...

Работа с оператором switch в цикле - C++
сhar ch; cin.get(ch); switch(ch) { case 'a': cout &lt;&lt; &quot;one &quot; &lt;&lt; endl; break; case 'b': cout &lt;&lt; &quot; two&quot; &lt;&lt; endl; break; case...

Работа с динамической памятью в цикле - C++
Всем привет. Есть переменная data, созданная динамически На каждой итерации цикла в нее записывается информация char* data =...

работа с циклом и условием в цикле - C++
Мне надо что бы после одного прохода цикла i=k-1 а после следующего прохода i=k+1 вобщем что б значения i чередовались... ааа я даже...

Работа stat+dirent в цикле - C++
Добрый день! Наверно голову уже всем пробил этими функциями но все же спрошу! Код: #include &lt;sys/types.h&gt; #include...

Некорректная работа ф-ции getch() в цикле - C++
while (iKey != 27) { iKey = getch(); cout &lt;&lt; &quot;qwer&quot;; } Не могу понять почему после нажатия любой клавиши(понятно кроме...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
09.04.2009, 16:31 #2
C++
1
2
3
4
5
6
7
8
9
if ( OpenDialog1->Execute() ) 
{
    TStringList *lst = new TStringList;
    lst->LoadFromFile(OpenDialog1->FileName);
    for (int i=0; i<lst->Count; i++) 
        mas1[i]=StrToInt(lst->Strings[0]); 
    Edit1->Text=mas1[77]; 
    delete lst;
}
1
Dezman666
1 / 1 / 0
Регистрация: 09.04.2009
Сообщений: 18
09.04.2009, 19:35  [ТС] #3
подставив ваш код масив состоит весь из первой цифры в текстовом документе, тоесть береться первое значение и записывается во все ячейки массива.

а вообще что делает lst->LoadFromFile ?
0
Lord_Voodoo
Супер-модератор
8588 / 2188 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
09.04.2009, 19:40 #4
Dezman666, LoadFromFile - вообще по названию можно догадаться, что это для загрузки из файла, а человек просто опечатку допустил, уж сами постарайтесь поправить код
0
Dezman666
1 / 1 / 0
Регистрация: 09.04.2009
Сообщений: 18
09.04.2009, 22:42  [ТС] #5
Сорри ступил, я естестно знал что LoadFromFile загружает из файла, просто хотеч понять как мы им воспользовались, опять же поспешил сам неподумал. Ошибку я исправил и очень благодарен за помощ!
0
haykart
Сообщений: n/a
09.04.2009, 22:54 #6
Цитата Сообщение от Dezman666 Посмотреть сообщение
Вообщем у меня стоит задача считать из текстового файла цифры, фаил состоит из ста строк в каждой по двузначной цифре. Мне надо эти цифры перегнать в масив, соответственно будет масив из ста двузначных цифр.

моя реализация:

Код C++1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 void __fastcall TForm1::N2Click(TObject *Sender) { const int len=2; int r; int i=0; char line[len]; int mas1[101]; OpenDialog1->FileName = "*.txt"; OpenDialog1->Options << ofPathMustExist << ofFileMustExist; if ( OpenDialog1->Execute() ) { FILE *file; char* file_name = OpenDialog1->FileName.c_str(); char load_string[10] = "none"; file = fopen( file_name, "r" ); while (!feof(file)) { fgets( load_string, 10 , file ); mas1[i]=StrToInt(load_string); i++; } fclose( file ); Edit1->Text=mas1[77]; } }
Проблема в цикле ваил, это я понимаю, но так как я изучал си в консоле, то с визуальным програмированием у меня проблемы и собственно все что я тут напрограммировал я узнал сегодня. Вот незнаю как выдти из тупика, подскажите плиз.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <fstream>
using namespace std;
int main()
{
       ifstream fin("input.txt");
       ofstream fout("output.txt");
       const int n=100;
       int a[100],i;
       for(i=0;i<n;i++)
              fin>>a[i];
       for(i=0;i<n;i++)
              fout<<a[i]<<endl;
       return 0;
}
Добавлено через 3 минуты 41 секунду
это простое решение твоего вопроса
прога читает иэ input.txt файла и печатоет в output.txt файл(ети файли должны находиться в папке твоего проекта)
Dezman666
1 / 1 / 0
Регистрация: 09.04.2009
Сообщений: 18
10.04.2009, 16:45  [ТС] #7
спасибо за вторую реализацию, смотрится попроще...
Но тут немного изменились условия и опять немного в тупике, вобщем в строчках будет не одна двузначная цифра а две, причем такого плана, отрывок из файла:
0.000000 0.000887
0.500000 2.084618
1.000000 2.640915
1.500000 1.984945
2.000000 1.179335
2.500000 0.987894
3.000000 0.571012
3.500000 0.725112
4.000000 0.401991
4.500000 0.485585
5.000000 0.423879
5.500000 0.273666
6.000000 0.179651

Соответственно мне нужны цифры из второго столбика. Я еще сам неискал ответ на этот вопрос, но думаю вам несложно обьяснить принцип.
Вот в этой реализации:
lst->LoadFromFile(OpenDialog1->FileName);
for (int i=0; i<lst->Count; i++)
mas1[i]=StrToInt(lst->Strings[i]);
береться вся строка, что в этом случае мы получаем в массиве, если в строке две цифры через пробел?
Во второй реализации беруться просто цифры стоящие через пробел, но у меня у файла есть заголовок, примерно строк 5-7 с описанием и только после начинаютсья два столбика цифр, так тчо не уверен что подойдет.
0
YurA_280784
Заблокирован
10.04.2009, 17:06 #8
Dezman666 Ты написал что у тебя файл из цифр в разных строках ну так у тебя структура файла тогда такая
цифра/r/nцифра/r/nцифра..../r/nцифра
Ну дык берём считываем всё в буффер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FILE *f;
char * chBuf;
char *chNum;
int massiv[100];
long fLen;
if((f = fopen("FilePath","rb+"))
{ 
    fseek(f,0,SEEK_END);
    fLen = ftell(f);
    fseek(f,0,SEEK_SET);
    chBuf = (char *)malloc(fLen);
    fread((void *)chBuf,1,fLen,f);
    fclose(f);
    int i = 0, n = 100;
    while(chNum = strrchr(chBuf,'\n'))
{
    massiv[n - i - 1] = atoi(chNum++);
    chBuf[strlen(chBuf) - strlen(chNum) - 2] = '\0';
     i++;
}
}
И всё....
1
Dezman666
1 / 1 / 0
Регистрация: 09.04.2009
Сообщений: 18
10.04.2009, 19:13  [ТС] #9
сенкс, буду разбираться.

to YurA_280784
можеш свой код переписать с коментариями, а то я почитал что делают операторы но целостной картины у меня так и несложилось. И вообще как я понял ты мне написал код для файла первой вариации, как я думал в начале он будет, т.е. :
45
76
85
36
45
34
76
92
и т.п.
а мне же нужно считать вторые цифры из :
0.000000 0.000887
0.500000 2.084618
1.000000 2.640915
1.500000 1.984945
2.000000 1.179335
2.500000 0.987894
3.000000 0.571012
А для первой вариации код oxotnik выгладит компактней и проще.

to YurA_280784
вообщем в коде я разобрался, теперь бы додумать как переделать
C++
1
2
3
4
5
6
 while(chNum = strrchr(chBuf,'\n'))
{
    massiv[n - i - 1] = atoi(chNum++);
    chBuf[strlen(chBuf) - strlen(chNum) - 2] = '\0';
     i++;
}
что бы бралась вторая цифра из строки...
0
Dezman666
1 / 1 / 0
Регистрация: 09.04.2009
Сообщений: 18
13.04.2009, 16:49  [ТС] #10
взяв вместо atoi atof я получил первый столбец, но мне нужен второй и как я понял все из за strrchr(chBuf,'\n') оно видимо под второй вариант файла неподходит.

Добавлено через 8 минут 51 секунду
все отлично я разобрался, просто надо было заменить знак перевода строки на табуляцию так: strrchr(chBuf,'\t') и я получил что хотел.
0
YurA_280784
Заблокирован
14.04.2009, 10:17 #11
Dezman666 я написал наверно не совсем то т.к. не знал структуры файла
Как я понимаю она у тебя такова
float float
float float
float float

И тебе нужен второй столбик, ну так нету проблемос)))
C++
1
2
3
4
5
6
7
8
9
10
11
12
FILE *f;
int i = 0;
float massiv1[100],massiv2[100];
if((f = fopen("FilePath","rb+"))
{ 
 while(!feof(f))//производим чтение пока не закончится файл
 {
  fscanf(f,"%f%f",&massiv1[i],&massiv2[i]);//построчное чтение
  i++;
 }
 fclose(f);
}
Добавлено через 3 минуты 4 секунды
В massiv1, massiv2 соответственно 1-й и 2-й столбики,вот
Ну а чёб много файлов подобнім алгоритмом считывать организуй функцию чтения
Например так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ReadFile(LPCTSTR FilePath, float *massiv1, float *massiv2)
{
       FILE *f;
int i = 0;
float massiv1[100],massiv2[100];
if((f = fopen("FilePath","rb+"))
{ 
        while(!feof(f))//производим чтение пока не закончится файл
        {
        fscanf(f,"%f%f",&massiv1[i],&massiv2[i]);//построчное чтение
        i++;
        }
        fclose(f);
}
}[FONT=monospace][/FONT]


Добавлено через 1 минуту 14 секунд
Только убери строчку
float massiv1[100],massiv2[100];
я запарился
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2009, 10:17
Привет! Вот еще темы с ответами:

работа с файлами - C++
в программе не работает удаление... что делать?? #include &quot;stdafx.h&quot; #include &lt;string.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; ...

Работа с файлами - C++
Даже не знаю как код записать примерно.Помогите ,а то вообще не могу понять и написать : разработать программу для работы с файлами на...

Работа с файлами - C++
Здравствуйте. В моей программе нужно зашифровать файл любого расширения, например jpg (я взял). Проблема в том, что: значения которые я...

работа с файлами - C++
ребят, подскажите, где можно почитать про работу с файлами, а именно: как всю информацию из файла записать в массив ? после того, как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.04.2009, 10:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru