Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Лииса
0 / 0 / 0
Регистрация: 02.02.2018
Сообщений: 21
1

Считывание чисел из файлов

26.04.2018, 09:43. Просмотров 853. Ответов 8
Метки нет (Все метки)

Здравствуйте, имеется 2 файла, в первом файле хранятся 2 числа: 121 122, во 2-ом файле также 2 числа: 123 124. Необходимо считать из 1го файла:121 из 2-го 123 и сложить, потом 122и 124 сложить. Проблема в том, что fread считывает только первые числа из 2х файлов, ко 2-ым не прикасается, подскажите, пожалуйста, как можно реализовать.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2018, 09:43
Ответы с готовыми решениями:

Считывание НЕопределенных чисел из НЕопределенных файлов в массив
Доброго времени суток. Такое дело. Имеется папка, путь к которой известен и он постоянный, в...

Считывание из файлов
Нужно составить программу на С++, программа считывания из файлов, помогите кто может

Считывание с файлов!
Даны файлы, вида part.0, part.1, part.2 и так далее(точное кол-во этих файлов неизвестно)!...

Считывание из файлов
Нужно составить программу на С++, программа считывания из файлов, помогите кто может

Считывание файлов и консоли с++
Почему программа не считывает а с консоли? #include <iostream> #include <cstdio> using namespace...

8
ПерС
435 / 362 / 324
Регистрация: 05.11.2013
Сообщений: 1,023
Записей в блоге: 6
Завершенные тесты: 1
26.04.2018, 11:33 2
текстовый или бинарный файл?
точно ли понимаешь разницу между ними?
fread или file.read?
и читаем числа - в цикле? или просто в 2 переменные? в массив из 2 элементов?
в общем, телепаты все в отпуске.
1
Лииса
0 / 0 / 0
Регистрация: 02.02.2018
Сообщений: 21
26.04.2018, 19:50  [ТС] 3
ПерС,
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
28
29
int main()
{
    FILE *fin;
    char *bi=new char[4];
    int r=0;
    for(int k=0;k<2;k++)
    {
 
            fin=fopen("1.txt","rb");
 
    fread(bi,sizeof(char),4,fin);
    fseek(fin,4,SEEK_SET);
    r=atoi(bi);
    r+=r;
   fclose (fin);
 
        fin=fopen("2.txt","rb");
 
        fread(bi,sizeof(char),4,fin);
        fseek(fin,4,SEEK_SET);
        r=atoi(bi);
        r+=r;
    cout<<r;
   fclose(fin);
 
    }
 
return 0;
}
0
ПерС
435 / 362 / 324
Регистрация: 05.11.2013
Сообщений: 1,023
Записей в блоге: 6
Завершенные тесты: 1
27.04.2018, 04:35 4
для текстового файла не нужно указывать режим чтения "rb" (хотя это не критично)
Если у тебя в файле действительно двоичные числа (на картинке вверху) - читай через fread
Если числа, записанные текстом (на картинке внизу) - через fscanf, например
Слева на картинках показаны байты каждого файла, справа - как он выглядит "текстом"

Вот я читаю и складываю 2 числа из первого (двоичного) файла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Visual Studio 2015
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
using namespace std;
 
int main(void) {
 FILE *fin = fopen("1.dat", "rb");
 int b,r=0;
 for (int k = 0; k < 2; k++) {
  fread(&b, sizeof(int), 1, fin);
  r+=b;
 }
 printf ("r=%d",r); //243
 fclose(fin);
 getchar(); 
 return 0;
}
Вот делаю то же самое со вторым (текстовым) файлом

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Visual Studio 2015
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
using namespace std;
 
int main(void) {
 FILE *fin = fopen("1.txt", "r");
 int b,r=0;
 for (int k = 0; k < 2; k++) {
  fscanf (fin,"%d",&b);
  r+=b;
 }
 printf ("r=%d",r); //243
 fclose(fin);
 getchar(); 
 return 0;
}
Текстовый файл можно создать, например, в стандартном "Блокноте"
Двоичный - только в специализированном редакторе или написать отдельную программку, которая его создает, например, для наших чисел 121 и 122 это будет

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Visual Studio 2015
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
using namespace std;
 
int main(void) {
 FILE *fout = fopen("1.dat", "wb");
 int b=121;
 for (int k = 0; k < 2; k++) {
  fwrite(&b, sizeof(int), 1, fout);
  b++;
 }
 fclose(fout);
 getchar(); 
 return 0;
}
Надеюсь, так одолеешь проблему. Обрати внимание, что в коде много других ошибок - например, поиск суммы (r)

1.png
1
27.04.2018, 04:35
ПерС
435 / 362 / 324
Регистрация: 05.11.2013
Сообщений: 1,023
Записей в блоге: 6
Завершенные тесты: 1
27.04.2018, 04:42 5
Для простоты здесь не проверяется, существуют ли файлы, так что они должны быть в текущей для проги папке
1
Лииса
0 / 0 / 0
Регистрация: 02.02.2018
Сообщений: 21
27.04.2018, 11:48  [ТС] 6
ПерС, спасибо за подробное объяснение. Мне необходимо в одной программе считать первое число из файла 1.txt , и первое число из файла 2.txt, потом вернуться в первый файл 1.txt считать 2ое число из него и сложить его со 2ым числом из 2го файла. Я использую fseek,чтобы запоминать позицию ,на которой я остановилась в файле,чтобы потом вернуться в него и считать след.число.Но в итоге,я считываю только первое число из 1.txt и первое число из 2.txt складываю их вывожу результат,а ко 2ому числу в файле 1.txt не перехожу,не могли бы вы мне с этим помочь разобраться?
0
ПерС
435 / 362 / 324
Регистрация: 05.11.2013
Сообщений: 1,023
Записей в блоге: 6
Завершенные тесты: 1
27.04.2018, 12:50 7
Лучший ответ Сообщение было отмечено Лииса как решение

Решение

зачем их закрывать и снова открывать-то, я не пойму?
используй 2 разных файловых дескриптора.

fseek не запоминает позицию, а устанавливает её. после закрытия файла это теряет смысл. есть fgetpos или ftell

вот мы читаем все 4 числа (из 2 текстовых файлов текущей папки проекта, см.рис.)
но здесь не нужно на самом деле запоминать никаких позиций, т.к. читаем всё равно последовательно

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
28
29
30
31
32
33
34
35
36
37
// Visual Studio 2015
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
using namespace std;
 
int main(void) {
 FILE *f1 = fopen("1.txt", "r");
 FILE *f2 = fopen("2.txt", "r");
 int n1,n2;
 fpos_t pos1,pos2; 
 
 fscanf(f1, "%d", &n1); 
 fgetpos(f1,&pos1); 
 fscanf(f2, "%d", &n2); 
 fgetpos(f2, &pos2);
 printf ("\nNumber 1 from file 1 = %d", n1);
 printf ("\nPosition from file 1 = %ld", pos1);
 printf ("\nNumber 1 from file 2 = %d", n2);
 printf("\nPosition from file 2 = %ld", pos2);
 
 fsetpos (f1,&pos1); //Не нужно, так как позиции УЖЕ на втором числе
 fsetpos (f2,&pos2);
 
 fscanf(f1, "%d", &n1);
 fgetpos(f1, &pos1);
 fscanf(f2, "%d", &n2);
 fgetpos(f2, &pos2);
 printf("\nNumber 2 from file 1 = %d", n1);
 printf("\nPosition from file 1 = %ld", pos1);
 printf("\nNumber 2 from file 2 = %d", n2);
 printf("\nPosition from file 2 = %ld", pos2);
 
 fclose(f2);
 fclose(f1);
 getchar();
 return 0;
}
1.png
1
Лииса
0 / 0 / 0
Регистрация: 02.02.2018
Сообщений: 21
27.04.2018, 13:20  [ТС] 8
ПерС, Спасибо!!!
0
marat_miaki
254 / 213 / 118
Регистрация: 08.04.2013
Сообщений: 922
27.04.2018, 13:29 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>
#include <cstdlib>
 
int main()
{
    int intF1, intF2=0;
    std::ifstream if1("1.txt");
     std::ifstream if2("2.txt");
    if (!if1.is_open() || !if2.is_open() )
    {
        std::cerr << "Unable to open files 1.txt or 2.txt \n";
        exit(1);
    }
      while (!if1.eof()) {
        if1>> intF1;
        if2>> intF2;
        std::cout << intF1+intF2 << std::endl;
    }
 
    if1.close();
    if2.close();
}
1
27.04.2018, 13:29
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2018, 13:29

Считывание файлов в папке с++
Здравствуйте, уважаемые знатоки! Задача простая: есть папка; в папке много файлов; нужно...

Считывание данных из файлов
Помогите считать каждое слово в текстовом файле и закинуть их в массив. Приблизительно понимаю что...

Считывание строк из потока файлов
люди плз помогите разобраться. в конце компиляции выдает сообщение &quot;error C2228: left of '.close'...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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