使用getline在文件中读取时将值迭代到向量中

时间:2017-03-14 22:32:51

标签: c++ vector

我正在尝试创建一个向量,其中填充了“blokus tiles”文件的每个字符串行的大小值。 (尺寸为5x5的周期或星星的瓷砖)。该文件作为字符串向量的向量读入,

vector <std::string> tile 
vector <vector<string>> alltiles

我正在尝试将值迭代到一个存储tile字符串大小(每行)的向量中。如果每条线的长度不同,或者每条线的长度不正确,或者除了星号(*)或句点(。)之外还有其他字符,我这样做是为了稍后输出错误。我这样做是为了在文件blokusstatus.txt(作为命令行参数输入)中打印tile的大小,

if (infile.is_open()) {
   while (std::getline(infile, tileline)) {   
     int actualtilesize = tileline.length();
     cout << actualtilesize << std::endl;

     tile.push_back(tileline);
     alltiles.push_back(tile); 
   }
  }
  infile.close();

//print out the contents of the file
  std::ofstream outfile;
  outfile.open(arginfile); 
  for (auto e: tile) { 
    cout << e << std::endl; 
  }

结果如下:

ec327@ec327-VirtualBox:~$ ./w5blokus2 5 blokusstatus.txt
5
5
5
5
5
0
5
5
5
5
5
0
5
5
5
5
5
.....
.*...
**...
*....
*....

.....
.....
**...
*....
**...

.....
.....
*....
***..
*....

这看起来不错。但是,我尝试以这种方式将数字列表转换为向量:

if (infile.is_open()) {   //infile is open only if 3 or 4 arguments
  int i = 0;
  while (std::getline(infile, tileline)) {
    for (int i=0; i <= tileline.end(); i++) {   
      vector <int> sizenums;
      sizenums[i] = tileline.length();
      i++;
      cout << sizenums << std::endl;
    }
    //cout << actualtilesize << std::endl;
  }
  tile.push_back(tileline);
  alltiles.push_back(tile); 
}
infile.close();

std::ofstream outfile;
outfile.open(arginfile);  
for (auto e: tile) { 
  cout << e << std::endl; 
}

编译时会出现相当长的错误,包括

  

^ ~~~~~~~   / usr / include / c ++ / 6 / ostream:497:5:注意:模板参数   /替换失败:

     

w5blokus3.cpp:80:15:注意:推导出参数的冲突类型   '_CharT'('char'和'std :: vector')        cout&lt;&lt; sizenums&lt;&lt;的std :: ENDL;&#34;

     

w5blokus3.cpp:80:15:注意:无法转换'sizenums'(类型   'std :: vector')输入'char'

     

cout&lt;&lt; sizenums&lt;&lt;的std :: ENDL;

我不知道出了什么问题。我是新手,感谢任何帮助或提示。

2 个答案:

答案 0 :(得分:0)

有两件事,你需要迭代向量来打印出它的内容而你不能使用 @Entity @Table(name = "persona") @Inheritance(strategy = InheritanceType.JOINED) @DynamicUpdate @SelectBeforeUpdate(value = false) @SelectBeforeUpdate(value = false) @NamedQueries({ @NamedQuery(name = "PersonasByRfc", query = "FROM Persona p WHERE p.rfc = :rfc "), @NamedQuery(name = "PersonasPorTipoPersona", query = "FROM Persona p WHERE p.tipoPersona = :tipoPersona "), @NamedQuery(name = "PersonaByClienteId", query = " SELECT c.persona FROM Cliente c WHERE c.clienteId = :clienteId "), @NamedQuery(name = "PersonaMoralActiva", query = "SELECT c.persona FROM Cliente c WHERE c.persona.regimenFiscal = 'MORAL' AND c.estatus = 'ACTIVO' ") }) public class Persona extends CommonBusinessProperties { private static final long serialVersionUID = 2846894501470704239L; private Long personaId; private CatTipoPersona tipoPersona; private String descripcionTipoPersona; private String nombres; private String apellidoMaterno; private String apellidoPaterno; private RegimenFiscal regimenFiscal; private Nacionalidad nacionalidad; private String rfc; private String curp; private Genero genero; private Date fechaNacimiento; private Boolean esCliente; private Boolean esContratante; private Boolean esPagador; private Boolean esMontoPagar; private BigDecimal montoPagar; private Boolean esPorcentajePagar; private String porcentajePagar; private String origenPersona; private String parentesco; private Parentesco tranParentesco; private Cliente cliente; private ExpedientePersona expedientePersona; private List<Domicilio> domicilios = new ArrayList<>(0); private List<Telefono> telefonos = new ArrayList<>(0); private List<Correo> correos = new ArrayList<>(0); /** * Constructor <br> * Crea una nueva instancia de Persona. <br> * * @author Orlando Adrián Ramos Galván (oramos@legosoft.com.mx, orlandoa.ramos@outlook.com)<br> */ public Persona() { super(); } /** * Constructor <br> * Crea una nueva instancia de Persona. <br> * * @param personaId * @author Orlando Adrián Ramos Galván (oramos@legosoft.com.mx, orlandoa.ramos@outlook.com)<br> */ public Persona(Long personaId) { super(); this.personaId = personaId; } /** * Constructor <br> * Crea una nueva instancia de Persona. <br> * * @param personaBuilder * @author Orlando Adrián Ramos Galván (oramos@legosoft.com.mx, orlandoa.ramos@outlook.com)<br> */ public Persona(PersonaBuilder personaBuilder) { this.tipoPersona = personaBuilder.getTipoPersona(); this.descripcionTipoPersona = personaBuilder.getDescripcionTipoPersona(); this.nombres = personaBuilder.getNombresORazonSocial(); this.apellidoMaterno = personaBuilder.getApellidoMaterno(); this.apellidoPaterno = personaBuilder.getApellidoPaterno(); this.setRegimenFiscal(personaBuilder.getRegimenFiscal()); this.setNacionalidad(personaBuilder.getNacionalidad()); this.setRfc(personaBuilder.getRfc()); this.curp = personaBuilder.getCurp(); this.genero = personaBuilder.getGenero(); this.fechaNacimiento = personaBuilder.getFechaNacimiento(); this.esCliente = personaBuilder.getEsCliente(); this.esContratante = personaBuilder.getEsContratante(); this.esPagador = personaBuilder.getEsPagador(); this.esMontoPagar = personaBuilder.getEsMontoPagar(); this.montoPagar = personaBuilder.getMontoPagar(); this.esPorcentajePagar = personaBuilder.getEsPorcentajePagar(); this.porcentajePagar = personaBuilder.getPorcentajePagar(); this.domicilios = personaBuilder.getDomicilios(); this.telefonos = personaBuilder.getTelefonos(); this.correos = personaBuilder.getCorreos(); } @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "persona_id", unique = true, nullable = false, updatable = false) public Long getPersonaId() { return this.personaId; } public void setPersonaId(Long personaId) { this.personaId = personaId; } @ManyToOne(fetch = FetchType.EAGER, targetEntity = CatTipoPersona.class) @JoinColumn(name = "tipo_persona_id") @Fetch(FetchMode.SELECT) public CatTipoPersona getTipoPersona() { return this.tipoPersona; } public void setTipoPersona(CatTipoPersona tipoPersona) { this.tipoPersona = tipoPersona; } @Column(name = "tipo_persona", length = 50) public String getDescripcionTipoPersona() { return this.descripcionTipoPersona; } public void setDescripcionTipoPersona(String tipoPersona) { this.descripcionTipoPersona = tipoPersona; } @Column(name = "origen_persona", length = 50) public String getOrigenPersona() { return this.origenPersona; } @Column(name = "nombres", length = 100) public String getNombresORazonSocial() { return this.nombres; } public void setNombresORazonSocial(String nombres) { this.nombres = nombres; } @Column(name = "apellido_materno", length = 100) public String getApellidoMaterno() { return this.apellidoMaterno; } public void setApellidoMaterno(String apellidoMaterno) { this.apellidoMaterno = apellidoMaterno; } @Column(name = "apellido_paterno", length = 100) public String getApellidoPaterno() { return this.apellidoPaterno; } public void setApellidoPaterno(String apellidoPaterno) { this.apellidoPaterno = apellidoPaterno; } @Transient public String getNombreCompleto() { return this.nombres + " " + this.apellidoMaterno + " " + this.apellidoPaterno; } @Column(name = "regimen_fiscal", length = 100) @Enumerated(EnumType.STRING) public RegimenFiscal getRegimenFiscal() { return this.regimenFiscal; } public void setRegimenFiscal(RegimenFiscal regimenFiscal) { this.regimenFiscal = regimenFiscal; } @Column(name = "nacionalidad", length = 100) @Enumerated(EnumType.STRING) public Nacionalidad getNacionalidad() { return this.nacionalidad; } public void setNacionalidad(Nacionalidad nacionalidad) { this.nacionalidad = nacionalidad; } @Column(name = "rfc", length = 13) public String getRfc() { return this.rfc; } public void setRfc(String rfc) { this.rfc = rfc; } @Column(name = "curp", length = 45) public String getCurp() { return this.curp; } public void setCurp(String curp) { this.curp = curp; } @Column(name = "genero", length = 1) @Convert(converter = GeneroConverter.class) public Genero getGenero() { return this.genero; } public void setGenero(Genero genero) { this.genero = genero; } @Temporal(TemporalType.DATE) @Column(name = "fecha_nacimiento", length = 10) public Date getFechaNacimiento() { return this.fechaNacimiento; } public void setFechaNacimiento(Date fechaNacimiento) { this.fechaNacimiento = fechaNacimiento; } @Column(name = "es_cliente") public Boolean isCliente() { return this.esCliente; } public void setIsCliente(Boolean esCliente) { this.esCliente = esCliente; } @Column(name = "es_contratante") public Boolean esContratante() { return this.esContratante; } public void setEsContratante(Boolean esContratante) { this.esContratante = esContratante; } @Column(name = "es_pagador") public Boolean isEsPagador() { return this.esPagador; } public void setEsPagador(Boolean esPagador) { this.esPagador = esPagador; } @Column(name = "es_monto_pagar") public Boolean getEsMontoPagar() { return this.esMontoPagar; } public void setEsMontoPagar(Boolean esMontoPagar) { this.esMontoPagar = esMontoPagar; } @Column(name = "monto_pagar", precision = 16, scale = 4) public BigDecimal getMontoPagar() { return this.montoPagar; } public void setMontoPagar(BigDecimal montoPagar) { this.montoPagar = montoPagar; } @Column(name = "es_porcentaje_pagar") public Boolean getEsPorcentajePagar() { return this.esPorcentajePagar; } public void setEsPorcentajePagar(Boolean esPorcentajePagar) { this.esPorcentajePagar = esPorcentajePagar; } @Column(name = "porcentaje_pagar", length = 6) public String getPorcentajePagar() { return this.porcentajePagar; } public void setPorcentajePagar(String porcentajePagar) { this.porcentajePagar = porcentajePagar; } public void setOrigenPersona(String origenPersona) { this.origenPersona = origenPersona; } @OneToOne(fetch = FetchType.EAGER, mappedBy = "persona", targetEntity = ExpedientePersona.class, optional = true) protected ExpedientePersona getExpedientePersona() { return this.expedientePersona; } protected void setExpedientePersona(ExpedientePersona expedientePersonas) { this.expedientePersona = expedientePersonas; } /** * @return parentesco */ @Column(name = "parentesco", length = 50) public String getParentesco() { return parentesco; } /** * @param parentesco */ public void setParentesco(String parentesco) { this.parentesco = parentesco; } @OneToOne(fetch = FetchType.EAGER, mappedBy = "persona", targetEntity = Cliente.class, cascade = { CascadeType.MERGE, CascadeType.DETACH }) @Fetch(FetchMode.SELECT) public Cliente getCliente() { return this.cliente; } public void setCliente(Cliente cliente) { this.cliente = cliente; } /** * @return si la persona esta relacionada al contratante y es una familiar este campo idnica que * parentesco tienen. */ @Transient public Parentesco getTranParentesco() { return tranParentesco; } /** * @param tranParentesco */ public void setTranParentesco(Parentesco tranParentesco) { this.tranParentesco = tranParentesco; } @OneToMany(fetch = FetchType.EAGER, mappedBy = "persona", targetEntity = Domicilio.class, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH }) @Fetch(FetchMode.SELECT) @OrderBy protected List<Domicilio> getDomicilios() { return this.domicilios; } protected void setDomicilios(List<Domicilio> domicilios) { this.domicilios = domicilios; } @OneToMany(fetch = FetchType.EAGER, mappedBy = "persona", targetEntity = Telefono.class, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH }) @Fetch(FetchMode.SELECT) @OrderBy protected List<Telefono> getTelefonos() { return this.telefonos; } protected void setTelefonos(List<Telefono> telefonos) { this.telefonos = telefonos; } @OneToMany(fetch = FetchType.EAGER, mappedBy = "persona", targetEntity = Correo.class, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH }) @Fetch(FetchMode.SELECT) @OrderBy protected List<Correo> getCorreos() { return this.correos; } protected void setCorreos(List<Correo> correos) { this.correos = correos; } } ,因为向量刚刚被初始化,你必须使用像{{1}这样的东西但是,无论如何,你再次使用它的方式是错误的,每次循环时你都要重新初始化变量,因此你只是用它来临时存储一个变量。相反,如果您想要实际存储每个行长度,则需要将其移动到循环外部。而且我不知道你为什么再把sizenums[i] = tileline.length();放在那里,似乎没必要。

答案 1 :(得分:0)

for (int i=0; i <= tileline.end(); i++) {   
   vector <int> sizenums;
   sizenums[i] = tileline.length();

首先,通过循环每次迭代创建一个新向量。您需要创建向量,然后循环或遍历它。

然而,在

之后
vector<int> sizenums;

你的矢量是空的。 []的直接访问不起作用。使用push_back将元素添加到结尾:

vector <int> sizenums;
...
for (int i=0; i <= tileline.end(); i++) {  
    sizenums.push_back(tileline.length());

此外:

 for(int i ...
     ...
     i++;

不要手动增加循环变量。 for循环已处理。