文件读写同时逐行读取文件

Posted

技术标签:

【中文标题】文件读写同时逐行读取文件【英文标题】:File read and write while reading the file line by line 【发布时间】:2015-05-11 06:12:13 【问题描述】:

程序:

#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 没有正确执行.... 也有重复的条目 不要进入“发现重复”的循环。

如果有人可以帮忙...

【问题讨论】:

你不应该像那样一起使用 C 和 C++ 方法。选择一个并坚持下去...... 我知道,但在“c”printf 和 scanf 中我讨厌使用它们。您知道的格式说明符...仅用于 cin 和 cout 我使用 C++ lib..在原始代码中我将只使用 c. 【参考方案1】:

fgets:

fgets(line,100,f);

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

使用

去除换行符
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++ 标准库替换整个 C 的丑陋。 使用C++,怎么做?我不太了解文件 IO 的 c+ 库 @Cool Guy:谢谢 :) @PrvnYadav ,我不太懂 C++,但我认为这是通过 fstreamofstream 以及 cin 来获取输入。 @PrvnYadav 这是一个概述基础知识的页面cplusplus.com/doc/tutorial/files【参考方案2】:

使用 while(fgets(line,100,f)!=NULL)

【讨论】:

这不是问题...问题在于与输入的字符串进行比较时每行中的换行符。

以上是关于文件读写同时逐行读取文件的主要内容,如果未能解决你的问题,请参考以下文章

C 语言文件操作 ( 配置文件读写 | 读取配置文件 | 函数接口形参 | 读取配置文件的逐行遍历操作 | 读取一行文本 | 查找字符 | 删除字符串前后空格 )

Java 学习笔记 - 读写字符文件

Java 学习笔记 - IO篇:读写文本文件txt

nodejs 文本逐行读写功能的实现

Go 入门很简单:Go 读取文本文件

C++文件读写操作如何统计文本的行数及如何读取文件某一行内容