C++ 比较C+中的字符串+;

C++ 比较C+中的字符串+;,c++,arrays,char,compare,C++,Arrays,Char,Compare,我想简化一个txt文档,我尝试了以下代码: #include <iostream> #include <conio.h> using namespace std; int main() { // 1. Step: Open files FILE *infile; FILE *outfile; char line[256]; infile = fopen("vcard.txt", "r"); outfile = fopen

我想简化一个txt文档,我尝试了以下代码:

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    // 1. Step: Open files
    FILE *infile;
    FILE *outfile;
    char line[256];
    infile = fopen("vcard.txt", "r");
    outfile = fopen("records.txt", "w+");
    if(infile == NULL || outfile == NULL){
         cerr << "Unable to open files" << endl;
         exit(EXIT_FAILURE);
    }

    // 2.Step: Read from the infile and write to the outfile if the line is necessary
    /* Description:
    if the line is "BEGIN:VCARD" or "VERSION:2.1" or "END:VCARD" don't write it in the outfile
    */

    char word1[256] = "BEGIN:VCARD";
    char word2[256] = "VERSION:2.1";
    char word3[256] = "END:VCARD";

    while(!feof(infile)){
        fgets(line, 256, infile);
        if(strcmp(line,word1)!=0 && strcmp(line,word2)!=0 && strcmp(line,word3)!=0){ // If the line is not equal to these three words
          fprintf(outfile, "%s", line); // write that line to the file
        }
    }

    // 3.Step: Close Files
    fclose(infile);
    fclose(outfile);

    getch();
    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
//1.步骤:打开文件
文件*填充;
文件*输出文件;
字符行[256];
infle=fopen(“vcard.txt”,“r”);
outfile=fopen(“records.txt”,“w+”);
if(infle==NULL | | outfile==NULL){

cerr
fgets
将换行符作为字符串的一部分返回。由于要比较的字符串不包含换行符,因此会将它们作为不同的字符串进行比较

<> P>因为你在C++中编写,你可能想使用<代码>:STF:<流> />代码> STD::GETLION<代码>来读取文件。
另一个(无关)问题:使用
while(!foef(文件))
错误,可能会导致最后一行被读取两次。相反,您应该循环,直到
fgets
返回空指针。

fgets
将换行符作为字符串的一部分返回。由于您要比较的字符串不包含换行符,因此会将它们作为不同的字符串进行比较

<> P>因为你在C++中编写,你可能想使用<代码>:STF:<流> />代码> STD::GETLION<代码>来读取文件。
另一个(无关)问题:使用
while(!foef(文件))是错误的,并且可能导致最后一行被读取两次。相反,您应该循环到<代码> fGe> /CUT>返回空指针。< /P>您想要使用C或C++?因为您的代码看起来更像是C源代码而不是C++源代码。真的没关系。C和C++都很好。我只想使用STD::CUT和STD::CURR。这就是为什么我会这样做。C++是C++的C++。有什么不对的?我应该用什么?读得很仔细。你想用C或C++?因为你的代码看起来比C源代码更像C源代码。其实没什么。C和C++都很好。我只想用STD::CUT和STD::CURR。这就是为什么我称它为C++。有什么不对?我应该用什么?读T?他非常小心。那么我应该用什么来代替fgets来解决第一个问题呢?@user1762990首先,单独调用
fgets()
,然后使用
while(feof(file)==0)<代码>循环…@ USE176990:我建议使用C++类,如在我的编辑中。如果你使用<代码> FGES,你需要自己删除尾行,或者将它与包含换行符的字符串进行比较(但是注意文件中的最后一行可能不包含换行符)@H2CO3:这没有帮助,它仍然可以读取最后一行两次。只需查看
fgets
的返回值,循环条件中不需要
feof
。@Scooter:引用链接:“此程序将始终打印一个大于输入流中字符数的字符(假设没有读取错误)”。在这里的程序中,
fgets
读取最后一行,程序将对其进行处理。然后调用
feof
并返回0。然后再次调用
fgets
。由于它立即遇到文件结尾,因此返回NULL,缓冲区内容不变。然后,代码将再次处理最后一行。只有在这之后,您才能再次调用所有
feof
,它返回非零,但是现在已经太迟了。那么我应该使用什么来代替fgets来解决第一个问题呢?@user1762990首先,单独调用
fgets()
,然后使用
while(feof(file)==0)<代码>循环…@ USE176990:我建议使用C++类,如在我的编辑中。如果你使用<代码> FGES,你需要自己删除尾行,或者将它与包含换行符的字符串进行比较(但是注意文件中的最后一行可能不包含换行符)@H2CO3:这没有帮助,它仍然可以读取最后一行两次。只需查看
fgets
的返回值,循环条件中不需要
feof
。@Scooter:引用链接:“此程序将始终打印一个大于输入流中字符数的字符(假设没有读取错误)”。在这里的程序中,
fgets
读取最后一行,程序将对其进行处理。然后调用
feof
并返回0。然后再次调用
fgets
。由于它立即遇到文件结尾,因此返回NULL,缓冲区内容不变。然后,代码将再次处理最后一行。只有在这之后,您才能再次调用all
feof
,返回非零,但为时已晚。