逐行读取文件时读取和写入文件

Prv*_*dav -1 c c++ string file-io char

程序:

#include<iostream>
#include<fstream>
#include<stdio.h>
#include<string.h>
using namespace std;

int main()
{
    FILE *f;
    char* line;
    size_t ln=100;
    char* s;
    line=new char[100];
    s=new char[100];
    cout<<"input key"<<endl;
    cin>>s;
    f=fopen("parvin.txt","r");
    if(f==NULL)
    {
        cout<<" no file TO read so creating for writing "<<endl;
        //return 0;
        f=fopen("parvin.txt","w");
        fputs(s,f);
        fputc('\n',f);
    }
    else
    {
        while(! feof(f))
        {
            fgets(line,100,f);
            cout<<line<<endl;

            //if(!strncmp(line,s,strlen(line)-1))
            if(strcmp(line,s)== 0 )
            {
                cout<<"duplicate found"<<endl;
                fclose(f);
                return 0;
            }
        }
        fclose(f);
        f=fopen("parvin.txt","a+");
        fputs(s,f);
        fputc('\n',f);
    }
    fclose(f);
}
Run Code Online (Sandbox Code Playgroud)

这里是我喜欢读取输入字符串并将其写入文件的上述程序,前提是字符串不存在于文件中.

  • 拿输入字符串
  • 在读取模式下打开文件.

  • 如果第一次输入文件不存在,如果文件指针返回NULL,则创建一个文件写入模式并写入输入的字符串.

  • 如果文件已经存在,则逐行读取文件并与输入字符串进行比较,如果与任何行匹配则返回并关闭.
  • 另外,在写入模式下打开相同的文件并写入输入的字符串.

但它不能正常工作..

strcmp没有正确执行....与重复条目也没有进入"duplicae found"的循环.

如果有人可以提供帮助,请

Spi*_*rix 5

fgets:

fgets(line,100,f);
Run Code Online (Sandbox Code Playgroud)

从中消耗换行符f并将其存储在中line.但s不包含换行符.因此,strcmp返回非零数字,因为字符串(sf)是不同的.

使用删除换行符

line[strcspn(line, "\n")] = '\0';
Run Code Online (Sandbox Code Playgroud)

就在这之后fgets.该strcspn功能,在你的情况下,返回的字符数,直到\nline.如果\n未找到line,则返回字符串line(strlen(line))的长度.


另外,阅读为什么while ( !feof (file) )总是错的?.更换

while(!feof(f))
Run Code Online (Sandbox Code Playgroud)

while(fgets(line,100,f)) //Same as `while(fgets(line,100,f) != NULL)`
Run Code Online (Sandbox Code Playgroud)

并且不要忘记fgets从循环体中删除以解决此问题.

  • 或者用C++标准库替换整个Cggility. (2认同)