2013-04-04 107 views
2

试图写入一个文件,该文件从文件的第一个字节读取到用户指定的字节。我需要关于逻辑的帮助。如果文件只有字母a到z,而我只想读取并显示前10个字符,例如。这里有一张我写的:从文件开头到指定字节的C++读取

char byte; 
    inFile.seekg(0L,ios::beg); 
    inFile.get(byte); 
    cout << byte; 

    for(int i = 0; i < num; i++); //num is an int specified by the user. 
    { 
     inFile.seekg(1, ios::cur); 
     inFile.get(byte); 
     cout << byte; 
    } 
+0

你的问题是什么?代码是否工作?如果不是,问题是什么? – Barmar 2013-04-04 23:14:33

+3

您的问题可能是您在每次读取后不需要前进1个字节。 'get'调用已经做到了。您的代码可能会跳过每个第二个字节。另外,除了循环之前的get之外,你还读取了比你需要的多一个字节,因为你的循环从0到num-1。 – MatthewD 2013-04-04 23:17:20

+0

'seek'用于当你不想从文件开始时顺序读取。 – Keith 2013-04-04 23:34:02

回答

1

第一个问题 - 在for()行结束的分号:

for(int i = 0; i < num; i++); 
    { 
     ... 
    } 

什么编译器看到的实际上是这样的:

for(int i = 0; i < num; i++) { /* do nothing num times */ } 

    { 
     // code that will only run once 
    } 

所以,删除分号。

接下来,如果您只是连续读取字节,则无需在每个字节之间寻找。只要调用get()就会得到序列中的下一个字节。因此请删除seekg()调用。

最终的问题 - 此功能实际上是呼吁inFile.get()num + 1次。第一个呼叫在for循环之前。然后在for循环中,get()被称为num次(即,i = 0,1,2,3 ... num-1)。您可以通过将for环路计数器更改为(i = 1; i < num; i++)或仅删除for环路之前的get()呼叫来解决此问题。在下面的代码中我选择了第二种方式:

void run(int num, istream &inFile) 
{ 
    char byte; 

    for(int i = 0; i < num; i++) 
    { 
     inFile.get(byte); 
     cout << byte; 
    } 
}