c++ - 文件读写的同时逐行读取文件

标签 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);
}

在上面的程序中,我喜欢读取输入字符串并将其写入文件,前提是该字符串尚未存在于文件中。

  • 获取输入字符串
  • 以读取模式打开文件。

  • 如果是第一次进入文件,如果文件指针返回NULL,则创建一个文件为写入模式,并写入 输入的字符串。

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

但它无法正常工作..

strcmp not executing properly.... with the duplicate entry also it dont go into that loop of "duplicae found" .

如果有人可以帮忙的话,请...

最佳答案

fgets:

fgets(line,100,f);

使用f中的换行符并将其存储在line中。但 s 不包含换行符。因此,由于字符串(sf)不同,strcmp 返回非零数字。

使用

去除换行符
line[strcspn(line, "\n")] = '\0';

就在fgets之后。在您的情况下,strcspn 函数返回 line\n 之前的字符数。如果在line中找不到\n,则返回字符串line的长度(strlen(line) )。

<小时/> 另请阅读Why is while ( !feof (file) ) always wrong? 。替换

while(!feof(f))

while(fgets(line,100,f)) //Same as `while(fgets(line,100,f) != NULL)`

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

关于c++ - 文件读写的同时逐行读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30160673/

相关文章:

c++ - 第 3 方库提示 MAXPATHLEN 未在一个项目中声明,但未在其他项目中声明

c++ - 跳过显式模板初始化以避免双重初始化

将字符串拆分为两个列表的 pythonic 方法

python - 删除所有内容直到达到任何数字(0-9)?

c++ - 函数到 Lambda

c++ - 构建带有 .v2 扩展名的 Boost 日期/时间 Jamfile

c - 用 nanosleep 替换 usleep

C:通过在函数中转换 void 指针来声明不同的类型

c - 当我只想接收单个连接时,应该如何在 C 中实现非阻塞服务器行为?

java - 在 Java 中拆分字符串的最佳方法