Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一种方式要求在C++中读取文本文件的某个位置?_C++_File_Text_Fstream - Fatal编程技术网

是否有一种方式要求在C++中读取文本文件的某个位置?

是否有一种方式要求在C++中读取文本文件的某个位置?,c++,file,text,fstream,C++,File,Text,Fstream,我使用的是一个文本文件,分为两行。每一行上都有几千个数字。所以看起来是这样的: X.11 X.12 X.13 ... X.21 X.22 X.23 ... 对于我程序的每个循环,我想从每一行读取一个数字。因此,对于循环的第一次迭代,它将是X.11和X.21,对于第二次迭代,它将是X.12和X.22,依此类推。我不需要存储这些值 预期产出: X.11 X.21 X.12 X.22 X.13 X.23 如何在C++中实现这一点? 我通常使用fstream读取文件,并

我使用的是一个文本文件,分为两行。每一行上都有几千个数字。所以看起来是这样的:

X.11   X.12   X.13   ...
X.21   X.22   X.23   ...
对于我程序的每个循环,我想从每一行读取一个数字。因此,对于循环的第一次迭代,它将是X.11和X.21,对于第二次迭代,它将是X.12和X.22,依此类推。我不需要存储这些值

预期产出:

X.11  X.21
X.12  X.22
X.13  X.23
如何在C++中实现这一点?
我通常使用fstream读取文件,并使用std::getlinefile,line逐行读取文件。如何从每行中读取一个数字?

如果您已经使用std::getlinefile,line读取了该行,则可以获取获得的字符串,并将其标记为char*p=strtok yourline;然后*p将在第一行中产生X.11,对于下一行,您只需再次调用strtok

如果您已经使用std::getlinefile,line读取了该行,您可以获取得到的字符串,并将其标记为char*p=strtok yourline;然后*p将在第一行中产生X.11,对于下一行,您只需再次调用strtok

对于fstream,您可以使用tellg和seekg来存储和恢复流中的位置。但是,我还没有验证它们是否与格式化输入一起工作良好


假设您不想将结果存储在内存中,并且只有两行,另一种解决方案是打开文件两次,并将其视为从两个不同的文件中读取行。

对于fstream,您可以使用tellg和seekg来存储和恢复流中的位置。但是,我还没有验证它们是否与格式化输入一起工作良好

假设您不想将结果存储在内存中,并且只有两行,另一种解决方案是打开文件两次,并将其视为从两个不同的文件中读取这些行

我不需要存储这些值

当然可以,但是如果您这样做了,比如说在两个双精度阵列中,那么您的循环将是微不足道的,并且比常规磁盘读取快得多。两个数千倍的数组可能比您想象的内存使用量要少。1 Mb的RAM可以包含131072个8字节双字节

我不需要存储这些值

当然可以,但是如果您这样做了,比如说在两个双精度阵列中,那么您的循环将是微不足道的,并且比常规磁盘读取快得多。两个数千倍的数组可能比您想象的内存使用量要少。1 Mb的RAM可以包含131072个8字节双字节

我想你需要:我想从每行读一个数字。 否则评论我;我将删除答案

用2个并行流读取文件:

std::ifstream input_file_stream_1( "file" );
std::ifstream input_file_stream_2( "file" );

std::string line_1;
std::string line_2;
std::string ignore;
std::getline( input_file_stream_2, ignore );    // ignore the whole first line

for( ; input_file_stream_1 >> line_1 && input_file_stream_2 >> line_2; ){
    std::cout << line_1 << " and " << line_2 << '\n';
}

input_file_stream_1.close();
input_file_stream_2.close();  
输出:

X.11  X.21
X.12  X.22
X.13  X.23
它是如何工作的? 因为您的文件只有两行,所以我在同一个文件上使用了两个输入流。其中一个用于第一行,另一个用于第二行。但在进入循环之前。输入文件\u流\u 2读取第一行,无需使用该行,因为输入文件\u流\u 1希望读取该行。所以在忽略这一行之后,第一行。输入文件\u流\u 1有第1行,输入文件\u流\u 2有第2行。现在,您有两条与流相关的行。在for循环中,或者当您可以通过>>运算符提取每个文本时

或者使用std::regex库:

注: 实现这一点的方法不止一种

我想你需要:我想从每行读一个数字。 否则评论我;我将删除答案

用2个并行流读取文件:

std::ifstream input_file_stream_1( "file" );
std::ifstream input_file_stream_2( "file" );

std::string line_1;
std::string line_2;
std::string ignore;
std::getline( input_file_stream_2, ignore );    // ignore the whole first line

for( ; input_file_stream_1 >> line_1 && input_file_stream_2 >> line_2; ){
    std::cout << line_1 << " and " << line_2 << '\n';
}

input_file_stream_1.close();
input_file_stream_2.close();  
输出:

X.11  X.21
X.12  X.22
X.13  X.23
它是如何工作的? 因为您的文件只有两行,所以我在同一个文件上使用了两个输入流。其中一个用于第一行,另一个用于第二行。但在进入循环之前。输入文件\u流\u 2读取第一行,无需使用该行,因为输入文件\u流\u 1希望读取该行。所以在忽略这一行之后,第一行。输入文件\u流\u 1有第1行,输入文件\u流\u 2有第2行。现在,您有两条与流相关的行。在for循环中,或者当您可以通过>>运算符提取每个文本时

或者使用std::regex库:

注:
有不止一种方法可以做到这一点

X.11和X.12应该是X.11和X.21??你可以做你想做的事,但是编写一个程序来转换整个文件,然后逐行读取可能会更容易。你的数字长度和行长是固定的吗?在这种情况下,您可以计算下一列的起始位置,并使用询问,因为示例看起来像这样……只需说:以二进制形式预处理此文件可能非常有用,因为我的程序的每个循环都有固定偏移量。我想从每行读取一个数字。但是您正在尝试在第一次迭代中阅读X.11和X.12?这两个数字不在同一行吗?你能添加一些伪代码来澄清你真正想要实现的目标吗?看起来你只是想读每行的前两个数字,这有点简单。X.11
&X.12应该是X.11和X.21??你可以做你想做的事,但是编写一个程序来转换整个文件,然后逐行读取它可能会更容易。你的数字长度和行长是固定的吗?在这种情况下,您可以计算下一列的起始位置,并使用询问,因为示例看起来像这样……只需说:以二进制形式预处理此文件可能非常有用,因为我的程序的每个循环都有固定偏移量。我想从每行读取一个数字。但是您正在尝试在第一次迭代中阅读X.11和X.12?这两个数字不在同一行吗?你能添加一些伪代码来澄清你真正想要实现的目标吗?这看起来你只是想读每行的前两个数字,这有点简单。谢谢。你能解释一下第一种方法中的for循环吗。没有迭代器它怎么工作?@Hadi是的。我会做的,汉克斯。你能解释一下第一种方法中的for循环吗。没有迭代器它怎么工作?@Hadi是的。我会做的
X.11 and X.21
X.12 and X.22
X.13 and X.23
... and ...