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;
}
// 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))
{
............
}
}
#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++
}
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,都可以
方法一:
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循环的问题,
哪位朋友愿意帮办,我把代码发给您看看,很短,只有十几行。很郁闷啊,
明天揭帖,
上边的几种方法我都尝试过,
都会遇到while循环只能循环一次,第二次就会报错了
我感到莫名其妙,用c++(c++编程思想上提供的方法)也同样会遇到while循环的问题,
哪位朋友愿意帮办,我把代码发给您看看,很短,只有十几行。很郁闷啊,
明天揭帖,
#14
我估计是password[30]分配的内存太小,而读出来的东东太长造成的,我过去也遇到过这种问题
#15
局部变量空间是分配在栈段,符合后进先出的原则,这样定义:
FILE *fp;
....
char password[30];
的结果是password的开始地址比fp的地址大30,假设password赋值的长度大于30,就会把fp的地址内容覆盖
FILE *fp;
....
char password[30];
的结果是password的开始地址比fp的地址大30,假设password赋值的长度大于30,就会把fp的地址内容覆盖
#16
第一,定义password[1024]实验一下
第二,不用fscanf, 用fread读出所有,剩下的工作程序中自己做
第二,不用fscanf, 用fread读出所有,剩下的工作程序中自己做
#17
>> 都会遇到while循环只能循环一次,第二次就会报错了
>> 我感到莫名其妙
那是因为你结束while循环时用的是 return。你应该使用 break;
程序中还存在着一个文件被多读一行的问题。先读取文件后判断文件结尾可避免这个问题。将while语句改写如下:
while(1)
{
fscanf(fp,"%s",password);
if(feof(fp)) break;
decryptFun(password);
//........
}
>> 我感到莫名其妙
那是因为你结束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;
}
// 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))
{
............
}
}
#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++
}
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,都可以
方法一:
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循环的问题,
哪位朋友愿意帮办,我把代码发给您看看,很短,只有十几行。很郁闷啊,
明天揭帖,
上边的几种方法我都尝试过,
都会遇到while循环只能循环一次,第二次就会报错了
我感到莫名其妙,用c++(c++编程思想上提供的方法)也同样会遇到while循环的问题,
哪位朋友愿意帮办,我把代码发给您看看,很短,只有十几行。很郁闷啊,
明天揭帖,
#14
我估计是password[30]分配的内存太小,而读出来的东东太长造成的,我过去也遇到过这种问题
#15
局部变量空间是分配在栈段,符合后进先出的原则,这样定义:
FILE *fp;
....
char password[30];
的结果是password的开始地址比fp的地址大30,假设password赋值的长度大于30,就会把fp的地址内容覆盖
FILE *fp;
....
char password[30];
的结果是password的开始地址比fp的地址大30,假设password赋值的长度大于30,就会把fp的地址内容覆盖
#16
第一,定义password[1024]实验一下
第二,不用fscanf, 用fread读出所有,剩下的工作程序中自己做
第二,不用fscanf, 用fread读出所有,剩下的工作程序中自己做
#17
>> 都会遇到while循环只能循环一次,第二次就会报错了
>> 我感到莫名其妙
那是因为你结束while循环时用的是 return。你应该使用 break;
程序中还存在着一个文件被多读一行的问题。先读取文件后判断文件结尾可避免这个问题。将while语句改写如下:
while(1)
{
fscanf(fp,"%s",password);
if(feof(fp)) break;
decryptFun(password);
//........
}
>> 我感到莫名其妙
那是因为你结束while循环时用的是 return。你应该使用 break;
程序中还存在着一个文件被多读一行的问题。先读取文件后判断文件结尾可避免这个问题。将while语句改写如下:
while(1)
{
fscanf(fp,"%s",password);
if(feof(fp)) break;
decryptFun(password);
//........
}
#18
感谢各位提供的解决方案,虽然问题我用其它方法有效的解决了,但还是学到了非常有用的东西