C++ 获取文件数据后刷新cout的问题
我正在尝试编写rc4的一个实现。我正在使用ifstream从文件中读取纯文本。我注意到它没有在文件末尾输出,所以我尝试了各种显式清除缓冲区的方法。无论以何种方式(使用endl、追加\n、调用cout.flush())尝试刷新缓冲区,我都会得到一个segfault。作为一个健全的检查,我用一个来自web的示例替换了我的代码,我还单独测试了这个示例。如果我把它放在它自己的文件中并编译它(例如,它打印出文件的内容,不segfault,也不需要任何对flush()或endl的调用),它就可以工作,但不需要在我的代码中 下面是一段令人不快的代码(在我的代码之外工作得很好;它几乎是直接从cplusplus.com复制的)C++ 获取文件数据后刷新cout的问题,c++,file,segmentation-fault,buffer,ifstream,C++,File,Segmentation Fault,Buffer,Ifstream,我正在尝试编写rc4的一个实现。我正在使用ifstream从文件中读取纯文本。我注意到它没有在文件末尾输出,所以我尝试了各种显式清除缓冲区的方法。无论以何种方式(使用endl、追加\n、调用cout.flush())尝试刷新缓冲区,我都会得到一个segfault。作为一个健全的检查,我用一个来自web的示例替换了我的代码,我还单独测试了这个示例。如果我把它放在它自己的文件中并编译它(例如,它打印出文件的内容,不segfault,也不需要任何对flush()或endl的调用),它就可以工作,但不需
ifstream是;
开放(“普通”);
字符c;
while(is.good())//可以从文件提取时循环
{
c=is.get();//从文件中获取字符
如果(is.good())
cout此外,我认为对is.good()的第二个调用[就像在if(is.good())],将阻止复制文件的最后一个字符。您可能正在向流中插入原始的'\0'
字符。在插入前将字符
强制转换为int
,看看是否有效。因为这没有帮助…我有点不知所措。您是否在调试器中运行了您的程序?这将对您有所帮助您可以确定崩溃的位置,还可以检查变量以帮助您找出可能的错误。我已经在调试器中查看了它。这取决于注释掉的代码,但通常在我尝试刷新cout(通过使用endl或flush())时,或在执行结束时(甚至在返回语句之后),它都会出错因此,在上面的第一段代码中,如果我在“cout.flush();”中添加了一个endl,或者如果我在“cout”中添加了一个endl,我想知道为什么这个示例中会有这样一个endl-文件是否良好不重要,因为我已经使用get()将其存储在c中了吗?对is.get()的调用可能会失败,这就是为什么他们添加了is.good()测试的原因。然而,good()在EOF之后也是false。因此,在正常的正常操作中,good()将返回false作为最后一个字符,因为已达到EOF。可能最好用fail()替换第二个good()测试,因为fail()是不受EOF影响。感谢您的解释。这似乎与我的问题无关,但一旦我弄清楚这个流,它可能会有所帮助。密钥长度是多长?256个字符还是255个字符?是否需要向字符k[256]添加额外的字节要保留运算符>>添加的NULL?在任何情况下,文件的构造肯定会导致此缓冲区写入超过其边界。可能需要使用二进制读取函数而不是文本提取运算符,或者使用宽度修饰符。
ifstream is;
is.open("plain");
char c;
while (is.good()) // loop while extraction from file is possible
{
c = is.get(); // get character from file
if (is.good())
cout << c;
// cout.flush();
}
is.close(); // close file*/
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
using namespace std;
static char s[256], k[256];
//static char *i, *j;
void swap(int m, int n, char t[256]){
char tmp = t[m];
t[m] = t[n];
t[n] = tmp;
}
char getByte(){
static char i(0), j(0);
i = (i+1)%256;
j = (j + s[i])%256;
swap(i, j, s);
return s[(s[i]+s[j]) % 256];
}
int main(int argc, char ** argv){
/*string key = argv[1];*/
if(argc < 4){
cout << "Usage: \n rc4 keyfile plaintextfile outputfile" << endl;
return -1;
}
string key;
ifstream keyfile (argv[1]);
keyfile >> k;
cout << "Key = " << k << endl;
keyfile.close();
/*ifstream plaintextf;
plaintextf.open(argv[2]);*/
ofstream ciphertextf (argv[3]);
for(int q = 0; q < 256; q++){
s[q] = q;
}
int i, j;
for(int m = 0; m < 256; m++){
j = (j + s[m] + k[m % sizeof(k)])%256;
swap(m, j, s);
}
// vector<char> bytes(plaintext.begin(), plaintext.end());
// bytes.push_back('\0');
// vector<char>::iterator it = bytes.begin();
/* char pt;
while(plaintextf.good()){
pt = plaintextf.get();
if(plaintextf.good()){
cout << pt;
ciphertextf <<(char) (pt ^ getByte());
}
} */
ifstream is;
is.open("plain");
char c;
while (is.good()) // loop while extraction from file is possible
{
c = is.get(); // get character from file
if (is.good())
cout << c;
// cout.flush();
}
is.close(); // close file*/
/*// plaintextf.close();
ciphertextf.close();
keyfile.close();
*/
return 0;
}