如何逐行读取文件中的字符串?

时间:2023-01-04 14:32:49
文件a.dic的内容如下:
a
b
cd
ass
133434
dkdfjd

如何才能把每行读取到一个字符串中?

我用如下方法,但在但在第一论循环后文件指针就被释放了,不知道为什么?高手指点
FILE fp;
if((fp = open(filename, "rb") == NULL) return;
char password[30];
while(1)
    {        
        if(!feof(fp)) 
        {
       fscanf(fp,"%s",password);
        }
        else
        {
            
    return;   
        }

        decryptFun(password);
         ........

       

    }   //  程序走到这里时,fp指针被释放了,而且循环内部的所用变量的值被释放,即便是全局     //变量   。 
        // 由于文件指针的释放,所以无法进入下轮循环了。

18 个解决方案

#1


用 fgets(buf,512,fp);  一次一行或者遇到结尾.

#2


是fopen()吧?open()是unix系统调用里的函数吧。打开模式不一样的啊。

#3


FILE fp;

看到这个问题没?

#4


贴一个用C++写的.
// EXER1_7.cpp : Defines the entry point for the console application.
//
//从文件(data.txt)中读入每个字到一个vector<string>对象中,遍历该对象
//将内容显示到cout,然后用泛型算法sort()对所有的文字排序
//然后再输出到文件(odata.txt)中
//#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;

int main(int argc, char* argv[])
{
ifstream infile("data.txt");
ofstream outfile("odata.txt");
vector<string> s;
string str;
while(infile>>str)
{
s.push_back(str);
}
sort(s.begin(),s.end());
for(int i=0;i<s.size();i++)
{
str=s[i];
cout<<s[i]<<endl;
outfile<<str<<endl;
}
system("Pause");
//printf("Hello World!\n");
return 0;
}

#5


#include<string>
#include<iostream>
#include<fstream>
using namespace std;

int main()
{  
    ifstream in("a.txt");
    string s,line;
    while(getline(in,line))
      {
       ............
      }
}

#6


FILE *fp;
int i=0;
if((fp = open(filename, "rb") == NULL)) 
         return;
char buf[50][120];
while(1)
{  
       fgets(buf[i],120,fp); 
       if (feof(fp))
            break;
        i++   
}     
       
       

#7


==================================
方法一:
FILE *fp;
char xx[80];
fp=fopen("file.txt","wr+");
memset(xx,0,80);
fgets(xx,80,fp);
while(xx)..........
================================
方法二:
FILE *fp;
char ch;
fp=fopen("file.txt","wr+);
while((ch=fgetc(fp))!='\n')
 ..........;
================================
还可以用fgetchar,都可以

#8


getline();

#9


应该是FILE *fp;

#10


为什么老有人把C++的东西发到C版来,大家应该尽量用C作答

#11


fgets

#12


FILE *fp;

#13


非常感谢楼上几位的热心回答,昨天晚上发贴匆忙,写错了几点
上边的几种方法我都尝试过,
都会遇到while循环只能循环一次,第二次就会报错了
我感到莫名其妙,用c++(c++编程思想上提供的方法)也同样会遇到while循环的问题,
哪位朋友愿意帮办,我把代码发给您看看,很短,只有十几行。很郁闷啊,
明天揭帖,

#14


我估计是password[30]分配的内存太小,而读出来的东东太长造成的,我过去也遇到过这种问题

#15


局部变量空间是分配在栈段,符合后进先出的原则,这样定义:
FILE *fp;
....
char password[30];
的结果是password的开始地址比fp的地址大30,假设password赋值的长度大于30,就会把fp的地址内容覆盖

#16


第一,定义password[1024]实验一下
第二,不用fscanf, 用fread读出所有,剩下的工作程序中自己做

#17


>> 都会遇到while循环只能循环一次,第二次就会报错了
>> 我感到莫名其妙

那是因为你结束while循环时用的是 return。你应该使用 break;

程序中还存在着一个文件被多读一行的问题。先读取文件后判断文件结尾可避免这个问题。将while语句改写如下:

while(1)
{
fscanf(fp,"%s",password);
if(feof(fp)) break;

decryptFun(password);
//........
}

#18


感谢各位提供的解决方案,虽然问题我用其它方法有效的解决了,但还是学到了非常有用的东西

#1


用 fgets(buf,512,fp);  一次一行或者遇到结尾.

#2


是fopen()吧?open()是unix系统调用里的函数吧。打开模式不一样的啊。

#3


FILE fp;

看到这个问题没?

#4


贴一个用C++写的.
// EXER1_7.cpp : Defines the entry point for the console application.
//
//从文件(data.txt)中读入每个字到一个vector<string>对象中,遍历该对象
//将内容显示到cout,然后用泛型算法sort()对所有的文字排序
//然后再输出到文件(odata.txt)中
//#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;

int main(int argc, char* argv[])
{
ifstream infile("data.txt");
ofstream outfile("odata.txt");
vector<string> s;
string str;
while(infile>>str)
{
s.push_back(str);
}
sort(s.begin(),s.end());
for(int i=0;i<s.size();i++)
{
str=s[i];
cout<<s[i]<<endl;
outfile<<str<<endl;
}
system("Pause");
//printf("Hello World!\n");
return 0;
}

#5


#include<string>
#include<iostream>
#include<fstream>
using namespace std;

int main()
{  
    ifstream in("a.txt");
    string s,line;
    while(getline(in,line))
      {
       ............
      }
}

#6


FILE *fp;
int i=0;
if((fp = open(filename, "rb") == NULL)) 
         return;
char buf[50][120];
while(1)
{  
       fgets(buf[i],120,fp); 
       if (feof(fp))
            break;
        i++   
}     
       
       

#7


==================================
方法一:
FILE *fp;
char xx[80];
fp=fopen("file.txt","wr+");
memset(xx,0,80);
fgets(xx,80,fp);
while(xx)..........
================================
方法二:
FILE *fp;
char ch;
fp=fopen("file.txt","wr+);
while((ch=fgetc(fp))!='\n')
 ..........;
================================
还可以用fgetchar,都可以

#8


getline();

#9


应该是FILE *fp;

#10


为什么老有人把C++的东西发到C版来,大家应该尽量用C作答

#11


fgets

#12


FILE *fp;

#13


非常感谢楼上几位的热心回答,昨天晚上发贴匆忙,写错了几点
上边的几种方法我都尝试过,
都会遇到while循环只能循环一次,第二次就会报错了
我感到莫名其妙,用c++(c++编程思想上提供的方法)也同样会遇到while循环的问题,
哪位朋友愿意帮办,我把代码发给您看看,很短,只有十几行。很郁闷啊,
明天揭帖,

#14


我估计是password[30]分配的内存太小,而读出来的东东太长造成的,我过去也遇到过这种问题

#15


局部变量空间是分配在栈段,符合后进先出的原则,这样定义:
FILE *fp;
....
char password[30];
的结果是password的开始地址比fp的地址大30,假设password赋值的长度大于30,就会把fp的地址内容覆盖

#16


第一,定义password[1024]实验一下
第二,不用fscanf, 用fread读出所有,剩下的工作程序中自己做

#17


>> 都会遇到while循环只能循环一次,第二次就会报错了
>> 我感到莫名其妙

那是因为你结束while循环时用的是 return。你应该使用 break;

程序中还存在着一个文件被多读一行的问题。先读取文件后判断文件结尾可避免这个问题。将while语句改写如下:

while(1)
{
fscanf(fp,"%s",password);
if(feof(fp)) break;

decryptFun(password);
//........
}

#18


感谢各位提供的解决方案,虽然问题我用其它方法有效的解决了,但还是学到了非常有用的东西