gpt4 book ai didi

c++ - 关于 C++ 中的文件 I/O

转载 作者:搜寻专家 更新时间:2023-10-31 00:48:52 25 4
gpt4 key购买 nike

我有一段代码执行以下操作:它以特定格式从文件中读取句子,并将它们放入 vector 中。为了检查 vector 中的字符串是否正确存储,我放置了调试 cout 语句。我发现vector的最后一个string member成员是“”。为什么会这样?我正在读取的文件以最后一个浮点值结尾(在每次迭代中存储在权重中)。之后没有空格或\n。我以下面单独程序的形式粘贴了那部分代码。

#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>

using namespace std;


int dist=0;

void stringtolower(char *s)

{

int i=0;

char c;

while(s[i]!='\0')

{

c=s[i];

c=tolower(c);

s[i]=c;

i++;

}

}



void cleanup(char *s)

{
int i=0;
dist=0;
while(*(s+i)=='\r' || *(s+i)=='\n' || *(s+i)=='\t')
{
dist++;
i++;
}

while(*(s+i)!='\0'){

/*if(*(s+i)=='"' || *(s+i)=='`' || *(s+i)=='\'' || *(s+i)=='.')

*(s+i)=' ';*/

if(*(s+i)==':' || *(s+i)=='\t' || *(s+i)=='\n' || *(s+i)=='\r' || *(s+i)=='"' || *(s+i)=='`' ){

*(s+i)='\0';

break;

}

i++;

}

return;

}





int isinlist(vector<string> sents, char *s){

for(int i=0;i<sents.size();i++){

if(!sents[i].compare(s)){

return 1;

}

}

return 0;

}

int main()
{
char *s=NULL;
FILE *fp;
fp=fopen("1.txt","r");
size_t len=0;
ssize_t read;
vector<string> sents;
float weight;
while(!feof(fp))
{
read=getdelim(&s,&len,':',fp);

cleanup(s);
s=s+dist;

fscanf(fp,"%f",&weight);


if(isinlist(sents,s)){

continue;

}
stringtolower(s);
string str(s);

//sentences.push(str); // Push sentence into FIFO queue for later processing
sents.push_back(str);
}
for(int i=0;i<sents.size();i++)
{
cout<<sents[i]<<endl;
}
}

非常感谢您的帮助。

最佳答案

因为您没有正确处理文件结尾 (eof)。

只有当您尝试读取超出文件末尾的部分时,您才能知道您已经到达了eof。考虑一个 0 长度文件的情况。当这种情况发生时,情况就会如此。

FILE *fp = fopen(..., "r");
assert(!feof(fp)); // guaranteed, even if the file is 0 length

也就是说,即使没有更多数据,feof 也不会返回 true,直到它真正尝试读取下一个字节。

您需要做的是在读取过程中检测文件结尾。例如:

FILE *fp = fopen(..., "r");
char buffer[SIZE];
while (fgets(buffer, sizeof(buffer), fp) != NULL)
{
// got some data, do something with it.
}

// fgets returned NULL, now let's check if it was because
// we got to the eof or had an error
if (feof(fp))
// got to the end
else
// got an error

如果 getdelim 编写正确,它应该在到达文件末尾时返回一个指示符。有两种不同的写法:

  1. 它只在到达 EOF 时还没有读取任何数据的情况下返回指标
  2. 它总是在到达 EOF 时返回指示器。

如果是前者,您希望将代码结构化为:

while (getdelim(&s,&len,':',fp) != GET_DELIM_EOF_VALUE)

如果是后者,你需要这样的东西:

while ((getdelim(&s,&len,':',fp) != GET_DELIMI_EOF_VALUE) ||
(len != 0))

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

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