Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2017, 04:38   #1
sviyav
 
Регистрация: 16.07.2017
Сообщений: 4
По умолчанию Не верно выводит в массив

Здравствуйте, столкнулась с такой проблемой: необходимо считать файл txt и записать в двумерный массив для дальнейшей работы с ним. НО количество строк неизвестно заранее, а столбцов 2.

Ранее сама задавала размер n на m и все нормально строилось, но теперь задача- с неизвестным количеством строк. Подскажите, пожалуйста как преобразовать после построчного чтения в array[i][j], где храняться вещественные числа. Для массива array[i][j] - определила кол-во строк и попыталась определить верно массив, но при выводе отдельно массива с 1 столбцом запись идет посимвольно.

Просмотрела все в поисковиках и смогла только реализовать построчное чтение и запись, опредлила кол-во строк. Но мне еще надо отдельно массив 1 и 2 столбца и в любой момент вызвать,например, 5 элемент в 1 столбце.

Прсто создание массива с неизвестным количеством строк:

Код:
#include <iostream>
#include <sstream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
using matNx2 = std::vector<std::vector<double> >;
using msize  = std::vector<double>::size_type;
 
void matNx2_load(matNx2& arr, std::istream& _in){
    unsigned i = 0;
    std::for_each(std::istream_iterator<double>(_in), std::istream_iterator<double>(), 
        [&i, &arr] (const double& x){
        if(i == 0)
            arr.push_back(std::vector<double>(2));
        arr[arr.size() - 1][i] = x;
        i ^= 1;
    });
}
 
int main(void){
    matNx2 mat;

   /* ввод из файла*/
    std::ifstream fp("exp470.txt");
    matNx2_load(mat, fp);
    fp.close();

    for(msize i = 0; i < mat.size(); ++i){
        for(msize j = 0; j < mat[i].size(); ++j)
            std::cout << mat[i][j] << ' ';
        std::cout << std::endl;
    }
    std::cin.get();
    return 0;
}
А здесь попытась определить кол-во строк и сохранить отдельно массив с 1 столбцом
Код:
#include <sys/types.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <fstream>
#include <sstream>
using namespace std;
 
#define STRLEN 102              // 102 -максимальная длина строки
char** array;               //массив  до нужных размеров строк
int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "Russian");
    char* filename = "exp470.txt";//имя файла
    int i = 0;          //счетчик
    FILE* exp1;
    char str[STRLEN];           //строка, которая читается из файла
    array = NULL;
 
    exp1 = fopen(filename, "rt"); //Открытие файла
    while (!feof(exp1))
    {
        fgets(str, STRLEN, exp1);  //читаем из файла по STRLEN байт
        ++i;                            //Наращиваем счетчик
        array = (char**)realloc(array, sizeof(char*)*i);         //растягиваем массив на количество символов из файла
        array[i - 1] = (char*)malloc(strlen(str) + 1);               //подготавка памяти для копирования строки из файла
        strcpy(array[i - 1], str);
    }
    puts("\nДанные файла:\n");   // чтение файла закончилось
    int j = 0;
    //цикл для проверки значений массива
    for (j = 0; j<i - 1; j++){
        printf("%s\n", array[j]);
    }
    string line;
    string text;
    int nLines = 0;
    ifstream ifs("exp470.txt");
    if (!ifs.is_open())
        cout << "Errro open input.txt\n";
    else
    {
        while (getline(ifs, line))
        {
            text += line + "\n";
            nLines++;
        }
        ifs.close();        cout << "Количество строк в файле : " << nLines << endl;
    }
    //создание динамического массива 
    std::ifstream exp1A_t("exp470.txt");
 
    if (!exp1A_t)
        cout << "Error!" << endl;
    else
    {
        for (int i = 0; i < nLines; ++i) //читаем файл и прочитанное запоминаем в массив 
        {
            for (int j = 0; j < 1; ++j)
            {
                exp1A_t >> array[i][1];
                cout << array[i][1] << " \n ";
            }
            cout << "\n";
        }
    }
    _getch();
}

q.jpg


Подскажите,пожалуйста, как все нормально исправить.
Вложения
Тип файла: txt exp470.txt (256 байт, 122 просмотров)

Последний раз редактировалось sviyav; 16.07.2017 в 04:45.
sviyav вне форума Ответить с цитированием
Старый 16.07.2017, 08:32   #2
agmag
Пользователь
 
Регистрация: 15.07.2017
Сообщений: 31
По умолчанию

Код:
char** array;
У вас создается массив строк, а не двумерный массив строк.

Поэтому здесь выводится 2-ой символ i-ой строки:
Код:
cout << array[i][1] << " \n ";
Код:
    std::ifstream exp1A_t("exp470.txt");
 
    //создаем двумерный массив указателей на float'ы
    float** arr = new float*[nLines];
	for(int i = 0; i < nLines; ++i) //инициализируем каждый указатель
	    arr[i] = new float[2];//..адресом последовательности из двух float
	//теперь arr[4] - обращение к четвертой строке, в которой хранится указатель на два float'а
	//arr[4][1] - обращение ко второму столбцу, 4-ой строки(там хранится уже значение)
    
    if (!exp1A_t)
        cout << "Error!" << endl;
    else
    {
        for (int i = 0; i < nLines; ++i) //читаем файл и прочитанное запоминаем в массив 
        {
		float col1;
		float col2;
                exp1A_t >> col1;//считываем первое вещественное число
                exp1A_t >> col2;//считываем второе вещественное число
                arr[i][0]=col1;
                arr[i][1]=col2;
        }
        
        cout<<"Left column"<<endl;
        //выводим значения только левого столбца
        for(int i=0;i<nLines;i++){
		cout<<arr[i][0]<<endl;
		//cout<<arr[i][1]<<endl;
	}
    }
agmag вне форума Ответить с цитированием
Старый 16.07.2017, 17:58   #3
sviyav
 
Регистрация: 16.07.2017
Сообщений: 4
По умолчанию

Спасибо,вам большое, разобралась и поняла что к чему
sviyav вне форума Ответить с цитированием
Старый 16.07.2017, 18:47   #4
sviyav
 
Регистрация: 16.07.2017
Сообщений: 4
По умолчанию

Подкажите, пожалуйста, еще вот в чем вопрос, работая с одним столбцом,например, первым, надо посчитать разность 2 и 1, 3 и 2 и т.д. строк. Считает верно, но потом вылетает программа - Unhandled exception at 0x00FDB6D9 in Proj.exe: 0xC0000005: Access violation reading location 0xFDFDFDFD.

Код:
for (int i = 0; i<=nLines; i++){
		exp1[i][0] = exp1[i+1][0] - exp1[i][0];
		cout << exp1[i][0] << endl << endl;//вывод времени
		
	}
и можно ли одновременно работать с массивом двойным? одновременно проводить разность такую для 1 и 2 столбца? и записать все в новой массив
sviyav вне форума Ответить с цитированием
Старый 16.07.2017, 19:12   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Считает верно, но потом вылетает программа
Мало того, что
Код:
i<=nLines
, так и
Код:
exp1[i+1][0]
p51x вне форума Ответить с цитированием
Старый 17.07.2017, 18:45   #6
sviyav
 
Регистрация: 16.07.2017
Сообщений: 4
По умолчанию

Код:
	for (int i = 0; i<nLines; i++){
		exp1[i][0] = exp1[i][0] - exp1[i-1][0];
		cout << exp1[i][0] << endl << endl;//вывод времени
		//cout<<arr[i][1]<<endl;//вывод работы
	}
Да,там ступтла,поздно делала.
Но даже так ту ошибку выдает, не ясно почему
sviyav вне форума Ответить с цитированием
Старый 17.07.2017, 19:15   #7
agmag
Пользователь
 
Регистрация: 15.07.2017
Сообщений: 31
По умолчанию

Код:
    if (!exp1A_t)
        cout << "Error!" << endl;
    else
    {
        for (int i = 0; i < nLines; ++i) //читаем файл и прочитанное запоминаем в массив 
        {
		float col1;
		float col2;
                exp1A_t >> col1;//считываем первое вещественное число
                exp1A_t >> col2;//считываем второе вещественное число
                arr[i][0]=col1;
                arr[i][1]=col2;
        }

	for(int i=1;i<nLines;i++){
		float col1 = arr[i][0]-arr[i-1][0];
		float col2 = arr[i][1]-arr[i-1][1];
		cout<< i << "-" << i-1 << ": " << col1 << " " << col2 << endl;
    }
    
    }
для отладки, сначала делают вывод значений:
Код:
	for(int i=0;i<nLines;i++){
		cout<< i << "-" << i-1 << endl; //чтобы понять к каким индексам будет обращение
    }
По выводу уже можно прикинуть как править индексы и цикл.
agmag вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++, вывести последнее слово из строки. Не выводит слово последнее, вроде все верно, работает, но не выводит anyamisss Помощь студентам 8 12.03.2017 17:44
Turbo С. Массив. Не выводит на экран Дмитрий123d Помощь студентам 2 25.11.2013 22:31
cout не выводит массив структуры. Surges Общие вопросы C/C++ 1 07.11.2013 13:24
верно или не верно????? Polusha Помощь студентам 1 19.04.2010 20:16
[B]Народ! Проверки мне верно или не верно? мне надо завтра сдавать[/B] Vladislav_87 Паскаль, Turbo Pascal, PascalABC.NET 6 04.06.2008 14:34