【问题标题】:Storing all lines from a file to a string array将文件中的所有行存储到字符串数组
【发布时间】:2020-01-21 02:00:48
【问题描述】:

我有以下代码逐行读取文本文件并将数据存储在string* 变量中:

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

int main(){
    // open a file in read mode.
   ifstream infile; 
   infile.open("iris.csv"); 

    // read file line by line and store here: 
    string *strlist; 
    int count =0; 
    for (string line; getline(infile, line); ) {
        strlist[count] = line; 
        count++; 
    }
    infile.close(); 
    //print all lines: 
    for (int i=0; i<count; i++){
        cout << strlist[i];
    }
}

上面的工作会不会有一些内存问题。在分配值 strlist[i]=line 之前是否需要创建一个 new 字符串?

我没有尝试过,担心错误可能导致数据损坏。感谢您的帮助。

【问题讨论】:

  • strlist 是未初始化的指针。请改用vector
  • 是的,矢量非常有用。谢谢。 Vector.push_backfirst in, first out 还是 first in, last out?
  • 您可以使用 push_back() 和 pop_back() 分别从向量中推送和弹出元素(总是从后面)。从这个角度来看,它是先进后出。但是,您也可以使用擦除删除特定索引(或范围)处的元素。

标签: c++ string list


【解决方案1】:

我认为如果你想在 C++ 中一次性加载文件,它一定会破坏你的记忆。只需阅读一行并在其上做一些事情或制作一个计数器以记住您加载了多少。完成一个部分后,再进行下一个。

【讨论】:

  • 欢迎来到stackoverflow。我知道文件会很小,所以我想一口气加载。
  • 这真的不聪明。
  • 我认为 c++ 不会收回备忘录。也许你可以尝试一个无用的文件。
【解决方案2】:

使用矢量是一个不错的选择。

#include <string>
#include <vector>
#include <fstream>
#include <iostream>
using namespace std;

int main(){
    // open a file in read mode.
   ifstream infile; 
   infile.open("iris.csv"); 

    // read file line by line and store here: 
    vector<string> strlist; 

    for (string line; getline(infile, line); ) {
    //or
    //while (getline(infile, line)) {
        strlist.push_back(line); 
    }
    infile.close(); 
    //print all lines: 
    for (int i=0; i<strlist.size(); i++){
        cout << strlist[i];
    }
}

【讨论】:

  • 是的,矢量非常有用。谢谢。
  • for (string line; getline(infile, line); ) 是如何工作的?这里没有第三个组件。
  • @rnso 这只是因为另一个问题而弹出:这里有一个更短的方法:stackoverflow.com/questions/16727125/…
  • @rnso getline 返回的值是对流对象本身的引用,当作为布尔表达式求值时,如果流已准备好进行更多操作,则为真,如果流的结束则为假文件已到达或发生其他错误。因此,当 getline 返回 false 时,for/while 循环会中断。在for循环的情况下,可以将第三条语句保持为空,因为我们不需要在每个循环之后执行任何语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多