在C ++中读到文件结尾

时间:2012-11-24 18:30:49

标签: c++ file

我正在尝试阅读直到文件结尾的电话本应用程序,即从C转换为C ++。当我从文件中打印结果时,我得到了这个:

johnny smith
(Home)3
(Cell)4
x☺> x☺>
(Home)4
(Cell)4

它应该打印:

johnny smith
(Home)3
(Cell)4

现在我正在使用while(!infile.eof()),我读过这是一种不好的做法,但是当我使用infile.getline()时,我会重复使用名字和姓氏,格式全部被忽略起来。无论如何(或其他方式)摆脱输入结束时的垃圾或其他方式阅读直到C ++文件结束修复此问题。我一直在阅读有关不同解决方案的内容,但许多网站似乎同意的是fgets,这是我对原始C版本所做的,但很明显fgets无效ifstream这就是我正在使用的。这是代码:

void contacts:: readfile(contacts*friends ,int* counter, int i,char buffer[],char    user_entry3[])
{
   ifstream read;
   read.open(user_entry3,ios::in);
   int len;
   contacts temp;
   *counter=0;
   i=0; 

     while (!read.eof()) { 
       temp.First_Name=(char*)malloc(36); 
       temp.Last_Name=(char*)malloc(36); 

       read>>temp.First_Name>>temp.Last_Name;

       read>>buffer;
       len=strlen(buffer);
       if(buffer[len-1]=='\n')
          buffer[len-1]='\0';

       temp.home=(char*)malloc(20); 
       strcpy(temp.home, buffer);

       read>>buffer;
       len=strlen(buffer);
       if(buffer[len-1]=='\n')
       buffer[len-1]='\0';


       temp.cell=(char*)malloc(20); 
       strcpy(temp.cell, buffer); 

      friends[i].First_Name=(char*)malloc(MAXNAME);
      friends[i].Last_Name=(char*)malloc(MAXNAME);
      friends[i].home=(char*)malloc(MAXPHONE);
      friends[i].cell=(char*)malloc(MAXPHONE);


  //adds file content to the structure
      strcpy(friends[*counter].First_Name,temp.First_Name);
      strcpy(friends[*counter].Last_Name,temp.Last_Name);
      strcpy(friends[*counter].home,temp.home);
      strcpy(friends[*counter].cell,temp.cell);


     (*counter)++;
     i++; 

   }
   //closes file and frees memory
    read.close();
    free(temp.Last_Name);
    free(temp.First_Name);
    free(temp.home);
    free(temp.cell);
}

2 个答案:

答案 0 :(得分:7)

使用eof()来确定您是否到达文件末尾。相反,请阅读您想要阅读的内容,然后然后检查您是否成功读取了数据。如果读取失败,您可以使用eof()确定在生成有关格式错误的错误报告之前错误是否已达到文件末尾。

既然您提到您使用!infile.eof()阅读,那么这是一个好习惯:您能指出我们这个错误信息的来源吗?此信息需要更正。

答案 1 :(得分:5)

  1. 请勿使用!eof()。它检查最后读取失败是否是由于到达文件末尾。它不能预测未来。

  2. 不要在C ++中使用malloc。如果这样做,请检查错误的返回值!

  3. 请勿将operator>>用于char *。没有大小检查,所以只是要求缓冲区溢出。

  4. '\n'检查缓冲区是没用的。字符串的operator>>在空格处停止。

  5. 你盲目strcpy将一段未知长度的字符串写入大小为20的temp.home。这是另一个缓冲区溢出。

  6. ......我有点停止在那里读书。如果你想从文件中读取东西但是停止在eof / error上,你可以这样做:

  7. string a, b, c;
    while (true) {
        if (!(in >> a)) break;
        if (!(in >> b)) break;
        if (!(in >> c)) break;
        do_stuff_with(a, b, c);
    }