天道酬勤,学无止境

如何读取txt文件C++并将它们拆分成列(How to read txt file C++ and split them into columns)

问题

这是我第一次用 C++ (Visual Studio 2010) 编写代码。 我有我想要实现的逻辑,但我不能把它写成代码。 查看了许多样本,但没有找到。

基本上我有一个制表符分隔的txt文件,我想读取它并将数据放入字符串,字符串数组中。

问题是使用内置的:

ifstream in;
in.open("someData.txt");
while(!in.eof())//the text from the file is stored in different variables
   {
   in>>inputData[0];
   in>>inputData[1];
   }

将数据放入字符串数组但按空格拆分行,即使数据行中出现空格,它也会将其分成两列,这是问题所在。

如何使用 C++ 正确地逐行读取数据并读取到列中?

回答1

如果您的列数据可能包含空格,最好在字符串周围使用"或添加'\t'作为分隔符。

您可以按如下所示重新排列代码以使用,以确保您最终不会读取空行。

ifstream in("someData.txt");
while(in>>inputData[0])
{
   in>>inputData[1];
}

如果任何行中的第二列的条目丢失,甚至更好。

std::string line;
while(getline(std::cin,line))
{
  // Splitting into 2 in case there is no space
  // If you colum may contain space, replace below lines with better logic.
  std::istringstream iss(line);
  inputData[0] = inputData[1] = default_value;
  iss >> inputData[0] >> inputData[1];
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • C ++:从文本文件读取并分成变量(C++: Read from text file and separate into variable)
    问题 我在一个文本文件中有这个: John 20 30 40 mike 30 20 10 我如何从文本文件中读取并将它们分成变量名,var1,var2,var3。 这是我的尝试,似乎不起作用。 请帮助。 #include <iostream> #include <fstream> #include <string> #include <sstream> using namespace std; int main () { string name,result; int number1; ifstream myfile ("marks.txt"); if (myfile.is_open()) { while ( !myfile.eof() ) { getline (myfile,name,'\t'); getline (myfile,var1,'\t'); getline (myfile,var2,'\t'); getline (myfile,var3,'\t'); cout << name << var1 << var2 << var3; } myfile.close(); } else cout << "Unable to open file"; return 0; } 编辑1: 夜曲建议: #include <iostream> #include <fstream>
  • 处理巨大的文本文件(Processing huge text files)
    问题 问题:我有一个巨大的原始文本文件(假设为 3gig),我需要遍历文件中的每个单词并找出某个单词在文件中出现了多少次。 我建议的解决方案:将大文件拆分为多个文件,每个拆分的文件将以排序的方式包含单词。 例如,所有以“ a ”开头的单词都将存储在“ _a.dic ”文件中。 所以,在任何时候我们都不会执行超过 26 个文件。 这种方法的问题是, 我可以使用流来读取文件,但想使用线程来读取文件的某些部分。 例如,使用单独的线程读取 0-1024 字节(根据框中存在的处理器数量,至少有 4-8 个线程)。 这是可能的还是我在做梦? 有什么更好的方法吗? 注意:它应该是纯 c++ 或基于 c 的解决方案。 不允许使用数据库等。 回答1 您需要查看 Kernighan 和 Pike 的“编程实践”,特别是第 3 章。 在 C++ 中,使用基于字符串和计数( std::map<string,size_t> ,IIRC)的std::map<string,size_t> 。 阅读文件(一次 - 它太大而不能多次阅读),边走边将其拆分为单词(对于“单词”的某些定义),并为您找到的每个单词增加地图条目中的计数。 在 C 中,您必须自己创建地图。 (或者找到 David Hanson 的“C 接口和实现”。) 或者您可以使用 Perl、Python 或 Awk(所有这些都有关联数组,相当于映射)。
  • 如何将大尺寸的 .txt 文件数据拆分成小部分并插入数据库?(How to split the large size .txt file data into small portion and insert into database?)
    问题 下面是我读取和拆分文本文件内容的代码。 try { br = new BufferedReader(new FileReader("F:\\Test.txt")); final char[] cbuf = new char[2048]; final int length = br.read(cbuf); cbuf[length] = '@'; String packet = new String(cbuf, 0, length + 1); final String[] splitedPacket=packet.split("@"); for(int i=0;i<splitedPacket.length;i++) { if(splitedPacket[i].contains("POS")) { System.out.println(splitedPacket[i]+"@"); preparedstatement=connection.prepareStatement("insert into inserttextfile([file]) values(?)"); preparedstatement.setString(1, splitedPacket[i]+"@"); preparedstatement.executeUpdate(); } } } catch
  • C++ 向量到 Python 3.3(C++ vector to Python 3.3)
    问题 我想从 C++ 脚本中获取 python 列表,例如[1,2,3,4] 。 我写了 C++ 脚本,它返回一个向量。 如何在没有 SWIG/SIP/Cython/等的情况下连接末端? 将 C++ 编译为 .exe 或 elf 文件,然后从命令行调用,让 .exe 创建一个包含向量的 .txt 并用 python 读取它会更容易吗? 我的观点是,我只需要一个来自 C++ 的非常小的函数来对大量数据进行大量计算。 做到这一点的最不痛苦和最短的方法是什么? 编辑:举个例子。 Python 会给 C++ 提供一个文件名字符串(“foo.txt”),然后 C++ 将读取文件的上下文(200,000 行 x 300 列),计算缺失值,然后将每行缺失值的数量返回给 Python。 这会产生一个包含 200,000 个数字的列表。 两者之间如何进行这种通信? 为了完整起见,这就是我仍然想知道如何去做的事情: 将 python 文件名字符串传递给 C++ 在 C++ 中接收 python 字符串完成在 C++ 中创建向量将向量返回给 Python 在 Python 中接收向量 回答1 这现在可能没有实际意义,我在你的另一个问题上发布了类似的内容,但我已经针对 Python 3.3 和 C++ 而不是 Python 2.7 和 C 调整了这个版本。 如果您想取回 Python 列表对象
  • c++文件读写操作
    对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处。 一、文件的输入输出 fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。 ifstream -- 从已有的文件读入 ofstream -- 向文件写内容 fstream - 打开文件供读写 文件打开模式: ios::in 只读 ios::out 只写 ios::app 从文件末尾开始写,防止丢失文件中原来就有的内容 ios::binary 二进制模式 ios::nocreate 打开一个文件时,如果文件不存在,不创建文件 ios::noreplace 打开一个文件时,如果文件不存在,创建该文件 ios::trunc 打开一个文件,然后清空内容 ios::ate 打开一个文件时,将位置移动到文件尾 文件指针位置在c++中的用法: ios::beg 文件头 ios::end 文件尾 ios::cur 当前位置 例子: file.seekg(0,ios::beg); //让文件指针定位到文件开头 file.seekg(0,ios::end); //让文件指针定位到文件末尾 file.seekg(10,ios::cur); //让文件指针从当前位置向文件末方向移动10个字节 file.seekg
  • CLion C ++无法读取/打开项目目录中的.txt文件(CLion C++ can't read/open .txt file in project directory)
    问题 我在项目目录中有一个.txt文件,该文件由我制作并填充了数据。 目录结构如下: /Users/asd/ClionProjects/ProjectWithTemplates/ main.cpp cmake twoday.txt 这是我的代码: #include <iostream> #include <array> #include <cmath> #include <fstream> using namespace std; /* print array prototype */ template <size_t N> void printArray(const array<double , N> & arr); /* mean function prototype */ template <size_t N> double meanArray(const array<double , N> & arr); /* standard deviation prototype */ template <size_t N> double sDeviation(const array<double , N> & arr); int main() { string date1; string date2; array<double, 24> day1Temps; array<double
  • (C ++)从文本文件中读取数字((C++) Reading digits from text file)
    问题 我有一个看起来像这样的文本文件: 73167176531330624919225119674426574742355349194934 96983520312774506326239578318016984801869478851843 85861560789112949495459501737958331952853208805511 等共20条线。 我想做的是从文本文件中读取每个数字,并将它们放入整数数组(一个元素=一位数字)。 我如何只能从此文本文件中读取一位数字,而不是整行? 回答1 有几种方法可以完成您要寻找的内容,在本文中,我将介绍三种不同的方法。 他们三个都假定您使用std::ifstream ifs ("filename.txt")打开文件,并且您的“数组”实际上是一个声明为std::vector<int> v 。 在这篇文章的末尾,还有一些关于如何加快插入向量的建议。 我想保持简单。 最简单的方法是使用operator>>一次读取一个char ,然后从返回的值中减去'0' 。 该标准保证'0'到'9'是连续的,并且由于char只是在不同事物上打印的数值而已,因此可以将其隐式转换为int 。 char c; while (ifs >> c) v.push_back (c - '0'); 我喜欢STL,但讨厌编写循环。 许多人将其视为“ c ++方式”
  • 具有列成2D向量的C ++文本文件(C++ text file with columns into 2D vector)
    问题 我有一个包含值的文本文件,我想将它们放入2D向量中。 我可以用数组来做,但是我不知道如何用向量来做。 向量大小应该类似于我事先不知道的vector2D [nColumns] [nLines]。 在文本文件中,最多可以有多少列,但没有行数。 从一个.txt文件到另一个.txt文件,列数可以不同。 .txt示例: 189.53 -1.6700 58.550 33.780 58.867 190.13 -3.4700 56.970 42.190 75.546 190.73 -1.3000 62.360 34.640 56.456 191.33 -1.7600 54.770 35.250 65.470 191.93 -8.7500 58.410 33.900 63.505 使用数组,我这样做是这样的: //------ Declares Array for values ------// const int nCol = countCols; // read from file float values[nCol][nLin]; // Fill Array with '-1' for (int c = 0; c < nCol; c++) { for (int l = 0; l < nLin; l++) { values[c][l] = -1; } } // reads file to
  • 从文件中读取整数并将它们存储在数组C ++中(Reading integers from file and store them in array C++ [closed])
    问题 关闭。 这个问题无法重现或由错别字引起。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 6年前关闭。 改善这个问题 这是我的代码,但我得到第一个数字的无限循环我想从文件中读取整数并将其存储在数组中 该文件包含: 8 5 12 1 2 7 #include<iostream> #include<fstream> #include<string> using namespace std; int main() { int n = 0; //n is the number of the integers in the file ==> 12 int num; int arr[100]; ifstream File; File.open("integers.txt"); while(!File.eof()) { File >> arr[n]; n++; } File.close(); for(int i=0;i<12;n++) { cout << arr[i] << " "; } cout << "done\n"; return 0; } 有什么帮助吗 回答1 我同意@ravi,但我为您提供一些注意事项: 如果您不知道文件中有多少个整数并且该文件仅包含整数,则可以执行以下操作: std::vector<int>numbers
  • 将整个ASCII文件读入C ++ std :: string [重复](Read whole ASCII file into C++ std::string [duplicate])
    问题 这个问题已经在这里有了答案: 如何在C ++中将整个文件读入std :: string? (15个答案) 4年前关闭。 我需要将整个文件读入内存并将其放在C ++ std::string 。 如果我将其读入char[] ,答案将非常简单: std::ifstream t; int length; t.open("file.txt"); // open input file t.seekg(0, std::ios::end); // go to the end length = t.tellg(); // report location (this is the length) t.seekg(0, std::ios::beg); // go back to the beginning buffer = new char[length]; // allocate memory for a buffer of appropriate dimension t.read(buffer, length); // read the whole file into the buffer t.close(); // close file handle // ... Do stuff with buffer here ... 现在,我想做完全相同的事情,但要使用std
  • 读取文本文件列明智的 C++(read text file column wise c++)
    问题 我有一个文本文件,其中数据存储为列。 如何将每一列提取到数组中? 例如:abcd 10 11 12 13 14 15 16 17 我想要四个数组,a = {10,14}, b = {11,15} c = {12,16} d = {13,17} 到目前为止,以下是我将它们添加到单个数组中的操作: CArray <double,double> *data = new CArray <double,double>(); CString strLine; TRY { CStdioFile file(m_fileName, CFile::modeRead); while(file.ReadString(strLine)) { CArray <double,double> arrayValues; splitString(strLine,arrayValues); for (int i=0; i< arrayValues.GetSize()-1;i++){ // Temp_data[i] = arrayValues.ElementAt(i); data->Add(arrayValues.ElementAt(i)); } } } CATCH_ALL(e) { e->ReportError(); // shows what's going wrong } END_CATCH_ALL void
  • 如何从Python中的txt文件读取数据集?(How to read a dataset from a txt file in Python?)
    问题 我有一个采用这种格式的数据集: 我需要导入数据并使用它。 主要问题是第一和第四列是字符串,而第二和第三列分别是浮点数和整数。 我想将数据放在一个矩阵中,或者至少获取每列数据的列表。 我试图以字符串的形式读取整个数据集,但这很混乱: f = open ( 'input.txt' , 'r') l = [ map(str,line.split('\t')) for line in f ] 有什么好的解决方案? 回答1 您可以使用熊猫。 它们非常适合读取csv文件,制表符分隔的文件等。当使用行/列进行访问时,熊猫几乎总是会正确地读取数据类型并将其放在numpy数组中。 我使用此制表符分隔的“ test.txt”文件: bbbbffdd 434343 228 D bbbWWWff 43545343 289 E ajkfbdafa 2345345 2312 F 这是熊猫码。 您将使用python中的一行在一个不错的数据框中读取您的文件。 您可以将“ sep”值更改为适合您文件的其他任何值。 import pandas as pd X = pd.read_csv('test.txt', sep="\t", header=None) 然后尝试: print X 0 1 2 3 0 bbbbffdd 434343 228 D 1 bbbWWWff 43545343 289 E 2
  • 使用C ++读取格式化文件(Formatted file reading with C++)
    问题 我正在尝试从文件中读取所有整数,并将它们放入数组中。 我有一个包含以下格式整数的输入文件: 3 74 74 1 1 74 8 76 基本上,每行包含一个数字,一个空格,然后是另一个数字。 我知道在Java中我可以使用Scanner方法nextInt()忽略间距,但是我发现C ++中没有这样的功能。 回答1 #include <fstream> #include <iostream> #include <vector> int main() { std::vector<int> arr; std::ifstream f("file.txt"); int i; while (f >> i) arr.push_back(i); } 或者,使用标准算法: #include <algorithm> #include <fstream> #include <iterator> #include <vector> int main() { std::vector<int> arr; std::ifstream f("file.txt"); std::copy( std::istream_iterator<int>(f) , std::istream_iterator<int>() , std::back_inserter(arr) ); } 回答2 int value; while
  • 在文本文件中获取第n列(Take nth column in a text file)
    问题 我有一个文本文件: 1 Q0 1657 1 19.6117 Exp 1 Q0 1410 2 18.8302 Exp 2 Q0 3078 1 18.6695 Exp 2 Q0 2434 2 14.0508 Exp 2 Q0 3129 3 13.5495 Exp 我想要这样的每一行的第二个和第四个词: 1657 19.6117 1410 18.8302 3078 18.6695 2434 14.0508 3129 13.5495 我正在使用此代码: nol=$(cat "/path/of/my/text" | wc -l) x=1 while [ $x -le "$nol" ] do line=($(sed -n "$x"p /path/of/my/text) echo ""${line[1]}" "${line[3]}"" >> out.txt x=$(( $x + 1 )) done 它可以工作,但是非常复杂,并且需要很长时间来处理长文本文件。 有没有更简单的方法可以做到这一点? 回答1 iirc: cat filename.txt | awk '{ print $2 $4 }' 或者,如评论中所述: awk '{ print $2 $4 }' filename.txt 回答2 您可以使用cut命令: cut -d' ' -f3,5 < datafile.txt 印刷
  • 从C ++中的文本文件读取数值数据(Read Numeric Data from a Text File in C++)
    问题 例如,如果外部文本文件中的数据是这样的: 45.78 67.90 87 34.89 346 0.98 如何阅读此文本文件并将每个数字分配给c ++中的变量? 使用ifstream,我可以打开文本文件并将第一个数字分配给变量,但是我不知道如何读取空格后的下一个数字。 #include <iostream> #include <fstream> using namespace std; int main() { float a; ifstream myfile; myfile.open("data.txt"); myfile >> a; cout << a; myfile.close(); system("pause"); return 0; } #include <iostream> #include <fstream> using namespace std; int main() { int data[6], a, b, c, d, e, f; ifstream myfile; myfile.open("a.txt"); for(int i = 0; i << 6; i++) myfile >> data[i]; myfile.close(); a = data[0]; b = data[1]; c = data[2]; d = data[3]; e = data[4]
  • 如何在C ++中逐行读取文件中的整数组(How to read groups of integers from a file, line by line in C++)
    问题 我有一个文本文件,每行上都有一个或多个整数,用空格分隔。 如何用C ++优雅地阅读此内容? 如果我不关心这些行,可以使用cin >>,但这对哪一行是整数很重要。 输入示例: 1213 153 15 155 84 866 89 48 12 12 12 58 12 回答1 这取决于您要逐行还是全套进行。 对于整个文件,将其转换为整数向量: int main() { std::vector<int> v( std::istream_iterator<int>(std::cin), std::istream_iterator<int>() ); } 如果要以每行为基础进行交易: int main() { std::string line; std::vector< std::vector<int> > all_integers; while ( getline( std::cin, line ) ) { std::istringstream is( line ); all_integers.push_back( std::vector<int>( std::istream_iterator<int>(is), std::istream_iterator<int>() ) ); } } 回答2 您可以像这样进行smtng(我使用了cin,但您可以使用任何其他文件流): string
  • 使用Java读取pdf文件中的表格或单元格值?(Reading a table or cell value in a pdf file using java?)
    问题 我已经通过Java和PDF论坛从pdf文件的表格中提取文本值,但是除了JPedal(它不是开源和许可的)之外,找不到任何解决方案。 因此,我想知道像pdfbox,itext之类的任何开源API都可以实现与JPedal相同的结果。 参考例子: 回答1 在评论中,OP澄清说他从表格中找到了要提取的pdf文件中的文本值 通过提供X和Y坐标 因此,虽然这个问题最初听起来像是从PDF中一般地提取表格数据(至少可能很困难),但实际上它实际上是关于从坐标给定的页面上的矩形区域中提取文本。 可以使用您提到的任何一个库(当然也可以是其他库)来实现。 文字 要限制要从中提取文本的区域,可以在FilteredTextRenderListener使用RegionTextRenderFilter ,例如: /** * Parses a specific area of a PDF to a plain text file. * @param pdf the original PDF * @param txt the resulting text * @throws IOException */ public void parsePdf(String pdf, String txt) throws IOException { PdfReader reader = new PdfReader(pdf)
  • 为什么 Java 读取大文件的速度比 C++ 快?(Why does Java read a big file faster than C++?)
    问题 我有一个 2 GB 的文件 ( iputfile.txt ),其中文件中的每一行都是一个单词,就像: apple red beautiful smell spark input 我需要编写一个程序来读取文件中的每个单词并打印字数。 我使用 Java 和 C++ 编写它,但结果令人惊讶:Java 的运行速度比 C++ 快 2.3 倍。 我的代码如下: C++: int main() { struct timespec ts, te; double cost; clock_gettime(CLOCK_REALTIME, &ts); ifstream fin("inputfile.txt"); string word; int count = 0; while(fin >> word) { count++; } cout << count << endl; clock_gettime(CLOCK_REALTIME, &te); cost = te.tv_sec - ts.tv_sec + (double)(te.tv_nsec-ts.tv_nsec)/NANO; printf("Run time: %-15.10f s\n", cost); return 0; } 输出: 5e+08 Run time: 69.311 s 爪哇: public static void main
  • 如何读写STL C ++字符串?(How to read and write a STL C++ string?)
    问题 #include<string> ... string in; //How do I store a string from stdin to in? // //gets(in) - 16 cannot convert `std::string' to `char*' for argument `1' to //char* gets (char*)' // //scanf("%s",in) also gives some weird error 同样的,我怎么写出来in ,以标准输出或文件? 回答1 您正在尝试将C风格的I / O与C ++类型混合使用。 使用C ++时,应将std :: cin和std :: cout流用于控制台输入和输出。 #include<string> #include<iostream> ... std::string in; std::string out("hello world"); std::cin >> in; std::cout << out; 但是,当读取字符串std :: cin遇到空格或换行符时,它将立即停止读取。 您可能要使用getline从控制台获取整行输入。 std::getline(std::cin, in); 您对文件使用相同的方法(处理非二进制数据时)。 std::ofstream ofs('myfile.txt')
  • 使用 Python 将纯文本文件解析为 CSV 文件(Parse a plain text file into a CSV file using Python)
    问题 我有一系列 HTML 文件,这些文件使用 Beautiful Soup 解析为单个文本文件。 HTML 文件的格式设置为它们的输出始终是文本文件中的三行,因此输出将类似于: Hello! How are you? Well, Bye! 但这也很容易 83957 And I ain't coming back! hgu39hgd 换句话说,每个 HTML 文件的内容并不是真正的标准,但它们总是产生三行。 所以,我想知道如果我想获取从 Beautiful Soup 生成的文本文件并将其解析为带有列的 CSV 文件,我应该从哪里开始(使用上面的示例): Title Intro Tagline Hello! How are you? Well, Bye! 83957 And I ain't coming back! hgu39hgd 从文本文件中剥离 HTML 的 Python 代码是这样的: import os import glob import codecs import csv from bs4 import BeautifulSoup path = "c:\\users\\me\\downloads\\" for infile in glob.glob(os.path.join(path, "*.html")): markup = (infile) soup =