2012-11-25 69 views
0

我试图从文本文件中读取字符,直到EOF,把它们放到字符数组中,以便我可以在后面操作它。用g ++编译没有错误,在运行时,系统会提示输入文件,但它只是挂起。如何从文本文件中逐字符读取字符并将其放入字符数组中?

int main (int argc, char *argv[]) { 
    string filename; 
    ifstream infile; 

    char *cp, c[1024]; 
    memset (c, 0, sizeof(c)); 
    cp = c; 

    cout << "Enter file name: " << endl; 
    cin >> filename; 

    //open file 
    infile.open(filename.c_str()); 

    //if file can't open 
    if(!infile) { 
     cerr << "Error: file could not be opened" << endl; 
     exit(1); 
    } 

    while (!infile.eof()); { 
     infile.get(c, sizeof(infile)); 
     // get character from file and store in array c[] 
    } 
}//end main 
+1

见http://stackoverflow.com/q/7241871/485561 – Mankarse

+1

你不应该由炭炭阅读。这不是20世纪80年代... – dda

+0

我应该提到它是为我的任务,但这是很好的知道。 – harman2012

回答

1

你应该尝试istream::read()方法,而不是get()。这将有助于解决任何缓冲区溢出:

unsigned int chars_read = 0; 
//... 
// Read in the file. 
if (!infile.read(c, sizeof(c)) 
{ 
    // Handle the read error here. 
    // Also check for EOF here too. 
} 

// Obtain the number of characters actually read. 
chars_read = infile.gcount(); 
+0

谢谢,这是非常有益的! – harman2012

0

首先,你想测试eof()!不知何故,我开始觉得唐吉诃德找到了我的风车。不过,我知道你需要检查输入是否成功试图读取它,因为在尝试读取流之前,无法知道它是否会成功。

你的程序其实不会挂!它只是等待您输入sizeof(infile)个字符或结束输入(例如,在Windows上使用Ctrl-D和在Windows上使用Ctrl-Z)。当然,这可能看起来像一个挂起的程序。您可以通过使用较小的尺寸验证这确实是问题,例如4。当然,sizeof(infile)几乎与一个小的随机数字一样好:它是std::ifstream类型的对象的大小,谁可以告诉它是什么?您可能打算使用sizeof(c)以确保对get(c, n)的呼叫不会写入比适合c更多的字符。

+0

OP还需要检查读取的字符数量与阵列容量。否则会发生缓冲区溢出。 –

+0

谢谢大家,改变sizeof(c)并做一个infile.gcount()已经有所帮助。我注意到,当我的文件正在读取时,它只会读取直到下一个返回行(因此只读取一行)? – harman2012

+0

我曾经使用过infile.get()和infile.read(),但是infile.read()忽略了新行。 – harman2012

0

试试这个:

int cont = 0; 
while(infile.good()) { 
    c[cont++] = infile.get(); 
} 
+0

解决方案可能导致缓冲区溢出。如果文件大小大于1024,则开始写入数组。 –

+0

是的,但不要责怪我,他是最大的限制:D – hinafu

相关问题