【问题标题】:C++ How would I read a file into an multidimensional array or three seperate arrays based on a sequence of delimiters?C++ 如何根据一系列分隔符将文件读入多维数组或三个单独的数组?
【发布时间】:2013-08-17 03:51:46
【问题描述】:

刚接触 c++ 和编程,我无法弄清楚这一点。

伪想法; 假设我可以定义分隔符

 ',' ',' '\n' 

然后逐行读取文件 同时将每个元素添加到每个数组中。

#define ARRAY_SIZE 1000 

string someString[ARRAY_SIZE];
double someDoubble[ARRAY_SIZE];
double someDoubble[ARRAY_SIZE]; 

那么我正在阅读的文本文件是

somestring, someDouble, someDouble\n    

或者换句话说,分隔符是逗号、逗号、换行符。

【问题讨论】:

  • 您是否在读取文件或基于分隔符标记读取行时遇到困难?
  • 没有问题逐行读取文件,只是我不知道如何在 c++ 中通过分隔符标记读取的行
  • 感谢您的意见!由于我的知识水平,列出的函数对我来说毫无意义,让我想知道如何使用它来将数据放入数组中。我最擅长的语言是 bash,我对 c++ 真的很陌生。您能否为我阐明您如何看待这适用于我的要求?抱歉,我好像有点过头了。
  • @BrianDanielPemberton 查看编辑。现已获批。

标签: c++ arrays delimiter


【解决方案1】:

如果你对分隔符和计数非常确定,那么你可以使用

#include<iostream>
#include<fstream>
#include<vector>
#include<string>
using namespace std;
int main()
{
    fstream fs;
    fs.open("abc.txt",ios::in);         //1
    string str;
    int counter = 0;
    vector<string> vecString;
    vector<double> vecDouble1;
    vector<double> vecDouble2;
    while(getline(fs, str))             //2
    {
        char *sArr = new char[str.length()+1];          //3
        strcpy(sArr, str.c_str());
        char *pch = strtok(sArr,",");                   //4
        vecString.push_back(pch);                       //5
        pch = strtok(NULL,",");
        vecDouble1.push_back(atof(pch));                //6
        pch = strtok(NULL,",");
        vecDouble2.push_back(atof(pch));
        delete[] sArr;                                  //7
    }
    cin.ignore();
}

我建议你使用数组而不是向量。

按需说明:

  1. 通过流以输入模式打开文本文件

  2. 逐行从文件中获取文本。

  3. 使用此中间字符数组是因为将 const 强制转换为非 `const 是不安全的。

  4. 根据分隔符(在您的情况下为单个逗号)标记输入行。教程请参考THIS

  5. 将元素添加到最后的向量中。

  6. atof() 用于将string 转换为double

  7. 释放中间字符指针。

【讨论】:

  • 也感谢您的输入!你介意带我看看这段代码在做什么,以便我了解发生了什么吗?
  • while 表达式中的 fs.getline() 调用将最多 100 个字符的数据读入一个完全没有分配空间的字符串中。因此,#2 是等待发生的段错误。同样,const_cast&lt;&gt; 仅在传递的数据的原点也是非常量的情况下才是安全的,在这种情况下并非如此。 (见this question)。简而言之,不要这样做。
  • @WhozCraig 我欢迎您的建议,但要投反对票。普通人
  • 修复代码,我很乐意不仅删除它,我还会投票赞成它。现有代码很可能会在第一个 getline() 上出错。为什么不使用getline() 的可选分隔符参数来寻求帮助?也许还有用于转换双打的自然流提取运算符。
  • @WhozCraig 我希望现在一切都好。还有其他建议吗??
猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多