Member 14621201 Ответов: 2

Открытие и чтение матричного файла


- Эй! Я пытаюсь заставить свой файл быть прочитанным и напечатанным на экране, я застрял на нем

Что я уже пробовал:

#include <iostream>
#include <iomanip>
#include <fstream>
#include <iostream>     // std::cout
#include <functional>   // std::minus
#include <numeric>

int main() {
    std::cout << "Please enter input file name: ";

    std::string iname;

    std::cin >> iname;

    std::ifstream ist {iname};          // ist is an input stream for the file named name
    std::ifstream f("");
    {
        if (f.is_open())
            std::cout << f.rdbuf();
        
    }
    std::cin.get();

}

Member 14621201

колонны вот такие:
A Z TKE Y Yerror
118 46 140.0 0.3326 E-03 0.6799 E-04
118 45 140.0 0.9057 E-04 0.1851 E-04
118 47 140.0 0.9122 E-04 0.1864 E-04
119 46 140.0 0.7077 E-04 0.2217 E-04
119 45 140.0 0.5748 E-05 0.1800 E-05
119 47 140.0 0.6486 E-04 0.2032 E-04
120 47 140.0 0.3259 E-03 0.7113 E-04
120 46 140.0 0.1016 E-03 0.2217 E-04
120 48 140.0 0.7759 E-04 0.1694 E-04

и мне нужно добавить 3-й столбец Y для каждого A (A проходит от 118 до 165), чтобы все 118 в строках продолжали добавлять Y

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Member 14621201

хорошо я сделаю это как можно скорее

2 Ответов

Рейтинг:
8

CPallini

Попробуйте также

#include <iostream>
#include <vector>
#include <utility>
#include <map>
#include <numeric>

using namespace std;
int main()
{ 
  vector < pair < int, double> > vp;
  multimap<int, double> mm;
  string line; 
  getline(cin, line); // skip header line
  
  for (;;)
  { 
    int id,z;
    double tke, y, yerror;
    cin >> id >> z >> tke >> y >> yerror;
    if ( ! cin ) break;
    mm.emplace( id, y);
  }
  auto it_begin = mm.begin(); 
  while (it_begin != mm.end() )
  { 
    auto it_end = mm.upper_bound(it_begin->first);
    auto sumfun = [] (double a, pair < int, double> p) {return a + p.second;};

    double sum = accumulate(it_begin, it_end, 0.0, sumfun);
    vp.push_back( make_pair(it_begin->first, sum));
    it_begin = it_end;
  }
  
  cout << "id ysum" << endl;
  for (auto p : vp) 
    cout << p.first << " " << p.second << endl;
}
Запустите его, перенаправив файл данных в качестве стандартного ввода.

Используется со следующими входными данными
A Z TKE Y Yerror
118 46 140.0 0.3326E-03 0.6799E-04
118 45 140.0 0.9057E-04 0.1851E-04
118 47 140.0 0.9122E-04 0.1864E-04
119 46 140.0 0.7077E-04 0.2217E-04
119 45 140.0 0.5748E-05 0.1800E-05
119 47 140.0 0.6486E-04 0.2032E-04
120 47 140.0 0.3259E-03 0.7113E-04
120 46 140.0 0.1016E-03 0.2217E-04
120 48 140.0 0.7759E-04 0.1694E-04

Он производит выход
id ysum
118 0.00051439
119 0.000141378
120 0.00050509


Member 14621201

Это выглядит идеально, я попытаюсь связать с открытым файлом, поэтому спрошу, какой файл открыть, и вернусь к вам, если у меня возникнут проблемы...

Member 14621201

хорошо, поэтому я переименовал свой файл вместо cf.h все еще получаю некоторые ошибки:

ошибка C2059: синтаксическая ошибка: 'constant'
ошибка C2143: синтаксическая ошибка: отсутствует ';' перед '{'
ошибка C2065: 'mm': необъявленный идентификатор
ошибка C3536: 'it_end': не может быть использован до его инициализации
ошибка C2065: 'vp': необъявленный идентификатор

ИСПОЛЬЗУЕМЫЙ КОД:
"#include<iostream>
#включить<stdio.h>
#include<stdlib.h>
#включить<math.h>
#включить<time.h>
код #include "conio размещен.ч"
код #include "ctype для.ч"
#включить "string.h"
#включить <вектор>
#включить <утилиту>
#включать
#include <numeric>
#включить "cf.h"
#включить <iomanip>
#включить <fstream>

использование пространства имен std;
тап_п()
{

//getline(cin, line); // пропустить строку заголовка

для (;;)
{
int id,z;
двойной tke, y, yerror;
Кин &ГТ;&ГТ; ИД &ГТ;> З &ГТ;&ГТ; тке &ГТ;&ГТ; г &ГТ;&ГТ; yerror;
если ( ! cin ) сломается;
мм. установить ("идентификатор", г);
}
авто it_begin = мм. начать();
пока (it_begin != мм. конец() )
{
авто it_end = мм. объектом upper_bound(it_begin-&ГТ;первый);
авто sumfun = [] (двойной, пара И Л; int, двойной&ГТ; п) {возвращение а + р.второй;};

двойная сумма = накопить(it_begin, it_end, 0.0, sumfun);
ВП.push_back( например, make_pair(it_begin-и gt;Во-первых, сумма));
it_begin = it_end;
}

соиь <&ЛТ; "ИД ysum" на << епси;
для (auto p : vp)
соиь <&ЛТ; п.первый &ЛТ;&ЛТ; "" &ЛТ;&ЛТ; п.второй на << епси;
}"

Рейтинг:
16

Visweswaran N

Я написал небольшую вспомогательную функцию, которая поможет, добавил комментарии, чтобы помочь вам понять.

// SWAMI KARUPPASWAMI THUNNAI

#include <iostream>
// As content of the file is in strings.
#include <string>
// For file IO
#include <fstream>
// For Matix storing
#include <vector>


std::vector<std::vector<double>> get_matrix(std::string file_path, char sep)
{
	std::vector<std::vector<double>> mat;
	std::ifstream file;
	file.open(file_path);
	// Throw exception if you want to
	if(!file.is_open())
	{
		return mat;
	}
	while(!file.eof())
	{
		std::string row;
		std::getline(file, row);
		std::vector<double> row_vec;
		std::string row_value = "";
		for(char c : row)
		{
			// If the character is seperator
			if(c == sep)
			{
				// Convert the string to double and append it and reset the string
				row_vec.push_back(std::stod(row_value));
				row_value = "";
			}
			else
			{
				row_value += c;
			}
		}
		// If the string is not empty append the last value [Last value generally gets ignored as there is no seperator afterwards]
		if(row_value.size() != 0)
		{
			row_vec.push_back(std::stod(row_value));
			row_value = "";
		}
		// Append the row now
		mat.push_back(row_vec);
	}
	file.close(); // Always close the opened file
	return mat;
}


int main()
{
	std::vector<std::vector<double>> mat = get_matrix("mat.txt", ' ');
	// Let's display our matrix
	for(auto i: mat)
	{
		for(auto j: i) std::cout << j << " ";
		std::cout << "\n";
	}
}


Содержимое моего файла:

118 46 140.0
118 45 140.0
118 47 140.0


Выход:

g++ -std=c++11 main.cpp -o test.exe


118 46 140
118 45 140
118 47 140



Примечание: Надежность обратно пропорциональна точности [код полный 2]. Этот код может быть точным, но он не является надежным. Даже небольшой пробел может нарушить этот код.

Обрезка струн и работа с другими вещами, такими как форма, - это ваш собственный поиск.


CPallini

5.

Visweswaran N

Спасибо вам, сэр, за вашу любезную помощь!