文件读写同时逐行读取文件
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
返回一个非零数字,因为字符串(s
和 f
)不同。
使用
去除换行符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++,但我认为这是通过fstream
或 ofstream
以及 cin
来获取输入。
@PrvnYadav 这是一个概述基础知识的页面cplusplus.com/doc/tutorial/files【参考方案2】:
使用 while(fgets(line,100,f)!=NULL)
【讨论】:
这不是问题...问题在于与输入的字符串进行比较时每行中的换行符。以上是关于文件读写同时逐行读取文件的主要内容,如果未能解决你的问题,请参考以下文章
C 语言文件操作 ( 配置文件读写 | 读取配置文件 | 函数接口形参 | 读取配置文件的逐行遍历操作 | 读取一行文本 | 查找字符 | 删除字符串前后空格 )