如何将文件中的特定数据读入数组字符串

Posted

技术标签:

【中文标题】如何将文件中的特定数据读入数组字符串【英文标题】:How to read specific data from file into array string 【发布时间】:2016-05-17 19:29:22 【问题描述】:
wer234 cwx1 20139   

asd223 cwx2 09678 

sda232 cwx3 45674 

ukh134 cwx4 23453 

plo209 cwx5 09573 

如何将数据读入三个字符串数组? 第一列到第一个字符串数组,第二列到第二个字符串数组,第三列到第三个字符串数组。 这是我尝试过的代码,但最后一个数组进入了该行。

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>

using namespace std;
 int main()
    //load the text file and put it into a single string:
    std::ifstream in("test.txt");
    std::stringstream buffer;
    buffer << in.rdbuf();
    std::string test = buffer.str();
    std::cout << test << std::endl << std::endl;

//create variables that will act as "cursors". we'll take everything between them.
size_t pos1 = 0;
size_t pos2;

//create the array to store the strings.
std::string str[5];
std::string str2[5];
std::string str3[5];

int x;
int y;

for(y=0; y<5;y++)



    for ( x=0; x<3; x++)

        pos2 = test.find(" ", pos1); //search for the bar "|". pos2 will be where the bar was found.

       if(x==0)

        str[y] = test.substr(pos1, (pos2-pos1)); //make a substring, wich is nothing more 

       else if(x==1)

        str2[y] = test.substr(pos1, (pos2-pos1)); //make a substring, wich is nothing more 


       else if(x==2)

        str3[y] = test.substr(pos1, (pos2-pos1)); //make a substring, wich is nothing more 


                                              //than a copy of a fragment of the big string.
      //  std::cout << str[x] << std::endl;
       // std::cout << "pos1:" << pos1 << ", pos2:" << pos2 << std::endl;
        pos1 = pos2+1; // sets pos1 to the next character after pos2. 
                         //so, it can start searching the next bar |.




    





for (int p=0; p<5; p++)

    cout << str[p] <<endl;
    cout << str2[p] <<endl;
    cout << str3[p] <<endl;




    return 0;


 

【问题讨论】:

你应该简单地使用operator&gt;&gt; 为什么不直接将operator&gt;&gt;与ifstream一起使用,在for循环中使用索引变量y in &gt;&gt; str[y] &gt;&gt; str2[y] &gt;&gt; str3[y];进行此操作 【参考方案1】:

如果考虑到非常大的文件,将整个文件放在一个字符串中可能会非常低效。

您尝试实现的目标并不像您预期​​的那么复杂(至少在 c++ 中)。你可以这样做:

for(size_t ind = 0; ind < 5; ++ind)
    in >> str[ind] >> str2[ind] >> str3[ind];

【讨论】:

是的,>> 运算符非常有效,但如果我的数据之间有空格,比如名字:Adam Maxwell。我需要将整个名称保存在 1 个字符串中。但是 >> 运算符会认为 Adam 是 1 个字符串,Maxwell 是另一个。 明确一点:你的分隔符是什么?是空格还是“|”因为它们都存在于您的代码中?【参考方案2】:

我换了一种方式试了,下面简单的代码来了解一下。

while(in.good())

string stri;
int i=1,a=0,b=0,c=0;
in >> stri;

switch(i%3) 
case 1:
str[a]=stri;
a++;
break;
case 2:
str2[b]=stri;
b++;
break;
case 3:
str3[c]=stri;
c++;
break;

i++;


这里的变量abc 计算数组索引。每个循环,它都会计算(i%3) 并填充正确的数组。

代码可能有一些问题,仅供参考。我什至没有测试它。

注意当且仅当您有 3 列时,此代码才有效。

【讨论】:

以上是关于如何将文件中的特定数据读入数组字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串中的所有数字一一读入数组(c++)

如何将具有特定字符串的excel表读入R

如何在MATLAB中读入多个音频文件啊?

如何将 .txt 文件中的特定整数存储在结构数组中?

在 C++ 中将文件读入字符数组

C++ 如何将输入的数读入数组