C语言,读取每一行到字符串数组

文件大概是这样的
123456
12345
1234
abcdef
qwerty

行数不固定,每行的内容不会超过20字符
读取到一个字符串数组, 就像是argc argv那样
是把所有行 读取到数组里面。
就像argv一样

argv[0] argv[1] 可以分别取出每一个字符串。
但是行数是不固定的。
但是行数是不固定的。
但是行数是不固定的。
但是行数是不固定的。
但是行数是不固定的。
但是行数是不固定的。
但是行数是不固定的。
但是行数是不固定的。
但是行数是不固定的。
但是行数是不固定的。

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
FILE * fp;
char buf[30];
fp=fopen("./eg_file.txt","r");//打开文件,我是在linux下写的,你把fopen中的第一个参数写成windows下的绝对路径就好了。

while(fscanf(fp,"%s",buf)!=-1){//读取文件中的一行写入字符串数组buf中
printf("%s\n", buf);
}
fclose(fp);//关闭文件
return 0;
}追问

只是输出出来我已经做到了

存到指针数组里面出现了问题,我不知道怎么存到数组里

追答

你跑一下程序,我不是已经吧字符串存到buf数组里面了么?你%c一个一个打印都可以的。你难道是想把文件里所有的行都写到一个数组里?我这是吧每一行都写进这个数组。

追问

是把所有的行都存到字符串数组里。
行数不固定

追答

#include
#include
#include

int main(int argc, char *argv[])
{
FILE * fp;
int x=2;
//char *buf;
char tmp[20];
fp=fopen("./eg_file.txt","r");
char *buf=(char *)malloc(20*sizeof(char));
memset(buf,0,20);
int length=20;

while(fscanf(fp,"%s",tmp)!=-1){
if(strlen(buf)+strlen(tmp)<length){
strcat(buf,tmp);
}
else{
length=20*x;
x++;
buf=(char*)realloc(buf,length*sizeof(char));
strcat(buf,tmp);
}
}
printf("%s\n",buf);
free(buf);
fclose(fp);
return 0;
}

没有问题了,我已经试验过了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-22
数据保存在一个文本文件里面?
使用文件输入ifstream,用getch()读取文件的每一行内容~
用eof() 判断文件是否为空~~~在把字符串连接起来~~
汗~~~我就说个思路~~~加油~
第2个回答  2011-08-22
数组的大小编译期就要确定,而你又说文件行数不定,实现不了的。追问

可以用堆内存,数组将要越界时候,就重新申请内存。

追答

那就不叫数组了,只能叫指针。这样实现是有问题的,内存的释放也不好管理。

追问

那好把 字符串指针的数组

追答

返回的只能是char** 类型了,而且内存释放就要释放两层了(里面的每个char* 和 外层的 char**)。一般没人会这么做,还是封装一下吧。

追问

那怎么做呢。。
反正就把所有行存到一个数组里就好了
但是行数是不固定的。

追答

看你是要做什么事情了,一般情况下是不会像你这样做的。如果文件不大,完全可以开一个几百k的内存空间把文件内容缓存到内存里,怎么用都方便。
顺便说一下 main 函数里面的 argv 实际上根本不是数组,它其实就是 char**,所以请别称它为数组。

第3个回答  2011-08-22
FILE *p=fopen("1.txt","r");
if(p==NULL)
return 0;
char a[20];
while(!feof(p))
{fscanf(p,"%s",a);
puts(a);
}追问

这个不行哦, 这个只是取一行
取一行我会,但是就是存到字符串数组 出现了问题

追答

你家取一行啊

追问

要存到数组里面。以后还会用到的。

追答

FILE *p=fopen("1.txt","r");
if(p==NULL)
return 0;
int i=0;
char a[100][100];
while(!feof(p))
{fscanf(p,"%s",a[i++]);
puts(a[i]);
}

第4个回答  推荐于2016-06-23
qwerty
abcdef
1234
12345
123456
Press any key to continue
#include "stdio.h"
#include "string.h"
main()
{
int i=0;
char AA[10][10];
FILE *fp;
fp=fopen("data.txt","r");
if(fp==NULL)
{
printf("Open File error!");
}
else
{
char a[10];
while(!feof(fp))
{
fscanf(fp,"%s",a);
strcpy(AA[i++],a);//AA[i++] = a;
}
}
fclose(fp);
for (i--;i>=0;i--)
{
printf("%s\n",AA[i]);
}
}追问

可以把每个字符串都放到字符串数组里吗?
就像是main的参数argv一样

追答

好了

追问

行数不固定...
又可能有100行 也可能有1000行。

追答

行数不固定 动态申请内存
123456
12345
1234
abcdef
qwerty
Press any key to continue
#include "stdio.h"
#include "string.h"
#include "malloc.h"
main()
{
int i=0,count=0;
FILE *fp;
char **AA;
fp=fopen("data.txt","r");
if(fp==NULL)
{
printf("Open File error!");
}
else
{
char a[10];
while(!feof(fp))
{
fscanf(fp,"%s",a);
count++;
}
rewind(fp);
//动态申请二维空间
AA = (char**)malloc(sizeof(char*)*count);
for (i=0; i<count; i++)
AA[i] = (char*)malloc(sizeof(char)*20);

for (i=0;i<count;i++)
{
fscanf(fp,"%s",a);
strcpy(AA[i],a);
}
for (i=0;i<count;i++)
{
printf("%s\n",AA[i]);
}

//释放空间
for (i=0; i<count; i++)
free(AA[i]);
free(AA);
}
fclose(fp);
}

本回答被提问者采纳
相似回答