Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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++_Regex_File Io - Fatal编程技术网

C++ 逐步读取文本文件

C++ 逐步读取文本文件,c++,regex,file-io,C++,Regex,File Io,我有一个文件,其中包含如下文本: #1#14#ADEADE#CAH0F#0#0..... 我需要创建一个代码来查找#symbol后面的文本,将其存储到变量中,然后将其写入不带#symbol的文件,但前面有一个空格。因此,从前面的代码中,我将得到: 1 14 ADEADE CAH0F 0 0...... 我最初尝试用Python做的,但是文件非常大,处理文件需要很长时间,所以我决定用C++编写这部分。但是,我对C++正则表达式一无所知,我正在寻求帮助。请你给我推荐一个简单的正则表达式库(我不太

我有一个文件,其中包含如下文本:

#1#14#ADEADE#CAH0F#0#0.....
我需要创建一个代码来查找#symbol后面的文本,将其存储到变量中,然后将其写入不带#symbol的文件,但前面有一个空格。因此,从前面的代码中,我将得到:

1 14 ADEADE CAH0F 0 0......

我最初尝试用Python做的,但是文件非常大,处理文件需要很长时间,所以我决定用C++编写这部分。但是,我对C++正则表达式一无所知,我正在寻求帮助。请你给我推荐一个简单的正则表达式库(我不太清楚C++)还是文档完整的?如果您提供一个小示例(我知道如何使用fstream执行文件传输,但我需要如何读取文件的帮助,正如我前面所说的那样)。

这看起来像是他和他值得信赖的伙伴的工作:

#包括
#包括
结构哈希是空间:std::ctype{
hash_是_space():std::ctype(get_table()){}
静态掩码常数*get_表()
{
静态掩模rc[表_尺寸];
rc['#']=std::ctype#u base::space;
返回&rc[0];
}
};
int main(){
使用std::string;
使用std::cin;
使用std::locale;
imbue(locale(cin.getloc(),新的hash_是_空间));
字符串字;
while(cin>>word){
std::cout这看起来像是他和他值得信赖的伙伴的工作:

#包括
#包括
结构哈希是空间:std::ctype{
hash_是_space():std::ctype(get_table()){}
静态掩码常数*get_表()
{
静态掩模rc[表_尺寸];
rc['#']=std::ctype#u base::space;
返回&rc[0];
}
};
int main(){
使用std::string;
使用std::cin;
使用std::locale;
imbue(locale(cin.getloc(),新的hash_是_空间));
字符串字;
while(cin>>word){

STD::P>iMo,C++不是你的任务的最佳选择。但是如果你必须在C++中做,我建议你看一下,Boost库的一部分。

IMO,C++不是你任务的最佳选择。但是如果你必须在C++中做,我建议你看一下,Boost库的一部分。

< P>如果你在UNIX上,一个简单的<代码>“s/#/”outfile
就足够了


Sed代表“stream editor”(并且支持regexes!whoo!),因此它非常适合您所需要的性能。

如果您在Unix上,一个简单的
Sed的/#//“outfile
就足够了


Sed代表“流编辑器”(并支持regexes!whoo!)这将非常适合你正在寻找的性能。

,我只是要把它变成一个答案而不是评论。不要使用正则表达式。这几乎肯定是这个任务的过度。我有点生锈了C++,所以我不会发布任何丑陋的代码,但是本质上你可以做的是把文件一个字符解析成t。ime,将任何不是
#
的内容放入缓冲区,然后在点击
#
时将其连同空格一起写入输出文件。在C语言中,至少会想到两种非常简单的解决方法:

StreamReader fileReader = new StreamReader(new FileStream("myFile.txt"),
                              FileMode.Open);
string fileContents = fileReader.ReadToEnd();
string outFileContents = fileContents.Replace("#", " ");
StreamWriter outFileWriter = new StreamWriter(new FileStream("outFile.txt"),
                                 Encoding.UTF8);
outFileWriter.Write(outFileContents);
outFileWriter.Flush();
或者,您可以替换

string outFileContents = fileContents.Replace("#", " ");

我不是说你应该用这些方法或者我的C++方法来做,也不是说这些方法都是理想的。我只是指出这里有很多方法来分析字符串。正则表达式是很棒的,强大的,甚至在极端情况下,但是它不是解析文本的唯一方法,甚至可以用于WR。真的


如果您坚持使用正则表达式(或被迫使用正则表达式,如家庭作业),然后我建议你听Chris的话,使用Boost.Regex。或者,如果你想尝试其他东西,我知道Boost也有一个很好的字符串库。只要留意一下你是否使用Regex。

好吧,我只是想回答一下,而不是发表评论。不要使用Regex。这几乎肯定是对这项任务的过度使用。我很抱歉有点生疏了C++,所以我不会发布任何丑陋的代码,但是基本上你可以做的是一次一个字符解析文件,把任何不是<代码> > <代码>的缓冲区放入一个缓冲区,然后当你碰到一个代码“< <代码> >时,把它写进输出文件中。在C中,至少有两个很容易解决的方法来解决这个问题。记住:

StreamReader fileReader = new StreamReader(new FileStream("myFile.txt"),
                              FileMode.Open);
string fileContents = fileReader.ReadToEnd();
string outFileContents = fileContents.Replace("#", " ");
StreamWriter outFileWriter = new StreamWriter(new FileStream("outFile.txt"),
                                 Encoding.UTF8);
outFileWriter.Write(outFileContents);
outFileWriter.Flush();
或者,您可以替换

string outFileContents = fileContents.Replace("#", " ");

我不是说你应该用这些方法或者我的C++方法来做,也不是说这些方法都是理想的。我只是指出这里有很多方法来分析字符串。正则表达式是很棒的,强大的,甚至在极端情况下,但是它不是解析文本的唯一方法,甚至可以用于WR。真的


如果你坚持使用正则表达式(或者被迫使用正则表达式,比如在做家庭作业时),那么我建议你听Chris的话,使用Boost.regex。或者,如果你想尝试其他东西,我知道Boost也有一个很好的字符串库。只要看看你是否使用正则表达式即可。

你遗漏了一个关键点:如果你有两个(或多个)输入中连续的
s,它们应该变成一个空格,还是有相同数量的空格
s

如果您想将整个字符串转换为一个空格,那么@Rob的解决方案应该可以很好地工作

如果您想将每个
#
都变成一个空格,那么编写C风格的代码可能是最简单的:

#include <stdio.h>

int main() { 
    int ch;
    while (EOF!=(ch=getchar()))
        if (ch == '#')
            putchar(' ');
        else
            putchar(ch);
    return 0;
}
#包括
int main(){
int-ch;
而(EOF!=(ch=getchar())
如果(ch='#')
putchar(“”);
其他的
putchar(ch);
返回0;
}

您遗漏了一个关键点:如果输入中有两个(或更多)连续的
s,它们应该变成一个空格,还是有相同数量的空格

如果您想将整个字符串转换为一个空格,那么@Rob的解决方案应该可以很好地工作

如果您想将每个
#
都变成一个空格,那么编写C风格的代码可能是最简单的:

#include <stdio.h>

int main() { 
    int ch;
    while (EOF!=(ch=getchar()))
        if (ch == '#')
            putchar(' ');
        else
            putchar(ch);
    return 0;
}
#包括
int-ma
open(file_path,'rb+')
fd = g.fileno()
x = g.read(chunk_size)
g.seek(- len(x),1)
g.write(x.replace('#',' '))
g.flush()
fsync(fd)
if g.tell() >= file_size:  break