gpt4 book ai didi

c++ - 在 C++ 中一直读到文件末尾

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:37 25 4
gpt4 key购买 nike

我正在尝试读取一个电话簿应用程序的文件末尾,该应用程序正在从 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);
}

最佳答案

  1. 不要使用 !eof()。它检查 last 读取失败是否是由于到达文件末尾造成的。它不预测 future 。

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

  3. 不要对 char * 使用 operator>>。没有大小检查,因此只是请求缓冲区溢出。

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

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

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

.

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

关于c++ - 在 C++ 中一直读到文件末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13544245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com