如何把文件的内容一行一行地读入到二维数组中

时间:2022-05-29 18:50:23
Google了一下,说是用fgets函数,可是不会用,哪位好心人能说详细一点吗
谢谢!

15 个解决方案

#1


#include <stdio.h>
  char *fgets( char *str, int num, FILE *stream );

 

函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以null结束.fgets()成功时返回str(字符串),失败时返回NULL.


fgets是将固定长度,写入一个串中

#3


ls的。。。太复杂鸟。。。
我这个很简单,文件内容差不多是这样的
aa
bbb
cccc

然后用一个二维数组char a[5][5]来储存
a[0]是aa,a[1]是bbb,a[2]是cccc等等
那fgets()括号里应该怎么写呢

#5


看12楼的readFile函数.

#6


ls那个还得自己定义啊。。。汗。。。
我这个只是另一个稍大一点的程序里的一小部分,所以希望不要写得太复杂,一个库函数就可以搞定的那种。

#7


GETS(3)                    Linux Programmer's Manual                   GETS(3)



NAME
       fgetc,  fgets,  getc,  getchar,  gets, ungetc - input of characters and
       strings

SYNOPSIS
       #include <stdio.h>

       int fgetc(FILE *stream);

       char *fgets(char *s, int size, FILE *stream);

       int getc(FILE *stream);

       int getchar(void);

       char *gets(char *s);

       int ungetc(int c, FILE *stream);

DESCRIPTION
       fgetc() reads the next character from  stream  and  returns  it  as  an
       unsigned char cast to an int, or EOF on end of file or error.

       getc()  is equivalent to fgetc() except that it may be implemented as a
       macro which evaluates stream more than once.

       getchar() is equivalent to getc(stdin).

       gets() reads a line from stdin into the buffer pointed to  by  s  until
       either  a  terminating newline or EOF, which it replaces with '\0'.  No
       check for buffer overrun is performed (see BUGS below).

       fgets() reads in at most one less than size characters from stream  and
       stores  them  into  the buffer pointed to by s.  Reading stops after an
       EOF or a newline.  If a newline is read, it is stored into the  buffer.
       A '\0' is stored after the last character in the buffer.

       ungetc()  pushes  c  back to stream, cast to unsigned char, where it is
       available for subsequent read operations.  Pushed-back characters  will
       be returned in reverse order; only one pushback is guaranteed.

       Calls  to the functions described here can be mixed with each other and
       with calls to other input functions from the stdio library for the same
       input stream.

       For non-locking counterparts, see unlocked_stdio(3).

RETURN VALUE
       fgetc(),  getc() and getchar() return the character read as an unsigned
       char cast to an int or EOF on end of file or error.

       gets() and fgets() return s on success, and NULL on error or  when  end
       of file occurs while no characters have been read.

       ungetc() returns c on success, or EOF on error.

CONFORMING TO
       C89,  C99,  POSIX.1-2001.  LSB deprecates gets().  POSIX.1-2008 removes
       the specification of gets().

BUGS
       Never use gets().  Because it is impossible to tell without knowing the
       data  in  advance  how  many  characters  gets() will read, and because
       gets() will continue to store characters past the end of the buffer, it
       is  extremely  dangerous  to  use.   It has been used to break computer
       security.  Use fgets() instead.

       It is not advisable to mix calls to  input  functions  from  the  stdio
       library with low-level calls to read(2) for the file descriptor associ‐
       ated with the input stream; the results  will  be  undefined  and  very
       probably not what you want.

SEE ALSO
       read(2), write(2), ferror(3), fgetwc(3), fgetws(3), fopen(3), fread(3),
       fseek(3),  getline(3),  getwchar(3),  puts(3),  scanf(3),   ungetwc(3),
       unlocked_stdio(3)

COLOPHON
       This  page  is  part of release 3.23 of the Linux man-pages project.  A
       description of the project, and information about reporting  bugs,  can
       be found at http://www.kernel.org/doc/man-pages/.



GNU                               2008-08-06                           GETS(3)

#8


楼上是fgets的文档,来自Linux的man,楼主可以参考。
对于楼主的具体问题,定义的数组为char file[MAX_LINES][MAX_COLUMNS];然后在循环里面这样调用fgets:fgets(file[i],MAX_COLUMNS,stdin);//i是循环变量

#9


@_@英文的都来鸟。。。

大家直接教教我那个fgets括号里怎么写就行啦。。。
拜托拜托。。。

#10


嗯,我试试看。。。

#11


直接用fgets读吧, 保存到字符数组就好了.

#include<stdio.h>
#include<stdlib.h>

int main()
{
     FILE *fd;
char fileName[50] = "d:\\data.txt";
int i = 0;
int j;
char content[10][255+1] = {'\0'};  //10行,每行最多包含字符255
     if((fd = fopen(fileName,"r")) == NULL) {
         printf("Can't open file %s\n",fileName);
         return 1;
     }
while(i < 10 && fgets(content[i], 255, fd)) {
i++;
}
printf("文件%s前10行内容为: \n", fileName);
for(j = 0; j < i; j++) {
printf("%d行: %s", j+1, content[j]);
}
     fclose(fd);
     return 0;
}  

#12


已经好了。可是还有个问题,文件每行都是以换行符结尾的,怎么能 不把换行符存进去呢?

#13


引用 12 楼 xiaozhuhh 的回复:
已经好了。可是还有个问题,文件每行都是以换行符结尾的,怎么能 不把换行符存进去呢?
手动的把\n赋值为\0

#14


读取完之后,在回车替换成字符串结束符'\0';
如:
while(i < 10 && fgets(content[i], 255, fd)) {
content[i][strlen(content[i])-1] = '\0';
i++;
}

#15


搞定。谢谢各位了!

#1


#include <stdio.h>
  char *fgets( char *str, int num, FILE *stream );

 

函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以null结束.fgets()成功时返回str(字符串),失败时返回NULL.


fgets是将固定长度,写入一个串中

#2


#3


ls的。。。太复杂鸟。。。
我这个很简单,文件内容差不多是这样的
aa
bbb
cccc

然后用一个二维数组char a[5][5]来储存
a[0]是aa,a[1]是bbb,a[2]是cccc等等
那fgets()括号里应该怎么写呢

#4


#5


看12楼的readFile函数.

#6


ls那个还得自己定义啊。。。汗。。。
我这个只是另一个稍大一点的程序里的一小部分,所以希望不要写得太复杂,一个库函数就可以搞定的那种。

#7


GETS(3)                    Linux Programmer's Manual                   GETS(3)



NAME
       fgetc,  fgets,  getc,  getchar,  gets, ungetc - input of characters and
       strings

SYNOPSIS
       #include <stdio.h>

       int fgetc(FILE *stream);

       char *fgets(char *s, int size, FILE *stream);

       int getc(FILE *stream);

       int getchar(void);

       char *gets(char *s);

       int ungetc(int c, FILE *stream);

DESCRIPTION
       fgetc() reads the next character from  stream  and  returns  it  as  an
       unsigned char cast to an int, or EOF on end of file or error.

       getc()  is equivalent to fgetc() except that it may be implemented as a
       macro which evaluates stream more than once.

       getchar() is equivalent to getc(stdin).

       gets() reads a line from stdin into the buffer pointed to  by  s  until
       either  a  terminating newline or EOF, which it replaces with '\0'.  No
       check for buffer overrun is performed (see BUGS below).

       fgets() reads in at most one less than size characters from stream  and
       stores  them  into  the buffer pointed to by s.  Reading stops after an
       EOF or a newline.  If a newline is read, it is stored into the  buffer.
       A '\0' is stored after the last character in the buffer.

       ungetc()  pushes  c  back to stream, cast to unsigned char, where it is
       available for subsequent read operations.  Pushed-back characters  will
       be returned in reverse order; only one pushback is guaranteed.

       Calls  to the functions described here can be mixed with each other and
       with calls to other input functions from the stdio library for the same
       input stream.

       For non-locking counterparts, see unlocked_stdio(3).

RETURN VALUE
       fgetc(),  getc() and getchar() return the character read as an unsigned
       char cast to an int or EOF on end of file or error.

       gets() and fgets() return s on success, and NULL on error or  when  end
       of file occurs while no characters have been read.

       ungetc() returns c on success, or EOF on error.

CONFORMING TO
       C89,  C99,  POSIX.1-2001.  LSB deprecates gets().  POSIX.1-2008 removes
       the specification of gets().

BUGS
       Never use gets().  Because it is impossible to tell without knowing the
       data  in  advance  how  many  characters  gets() will read, and because
       gets() will continue to store characters past the end of the buffer, it
       is  extremely  dangerous  to  use.   It has been used to break computer
       security.  Use fgets() instead.

       It is not advisable to mix calls to  input  functions  from  the  stdio
       library with low-level calls to read(2) for the file descriptor associ‐
       ated with the input stream; the results  will  be  undefined  and  very
       probably not what you want.

SEE ALSO
       read(2), write(2), ferror(3), fgetwc(3), fgetws(3), fopen(3), fread(3),
       fseek(3),  getline(3),  getwchar(3),  puts(3),  scanf(3),   ungetwc(3),
       unlocked_stdio(3)

COLOPHON
       This  page  is  part of release 3.23 of the Linux man-pages project.  A
       description of the project, and information about reporting  bugs,  can
       be found at http://www.kernel.org/doc/man-pages/.



GNU                               2008-08-06                           GETS(3)

#8


楼上是fgets的文档,来自Linux的man,楼主可以参考。
对于楼主的具体问题,定义的数组为char file[MAX_LINES][MAX_COLUMNS];然后在循环里面这样调用fgets:fgets(file[i],MAX_COLUMNS,stdin);//i是循环变量

#9


@_@英文的都来鸟。。。

大家直接教教我那个fgets括号里怎么写就行啦。。。
拜托拜托。。。

#10


嗯,我试试看。。。

#11


直接用fgets读吧, 保存到字符数组就好了.

#include<stdio.h>
#include<stdlib.h>

int main()
{
     FILE *fd;
char fileName[50] = "d:\\data.txt";
int i = 0;
int j;
char content[10][255+1] = {'\0'};  //10行,每行最多包含字符255
     if((fd = fopen(fileName,"r")) == NULL) {
         printf("Can't open file %s\n",fileName);
         return 1;
     }
while(i < 10 && fgets(content[i], 255, fd)) {
i++;
}
printf("文件%s前10行内容为: \n", fileName);
for(j = 0; j < i; j++) {
printf("%d行: %s", j+1, content[j]);
}
     fclose(fd);
     return 0;
}  

#12


已经好了。可是还有个问题,文件每行都是以换行符结尾的,怎么能 不把换行符存进去呢?

#13


引用 12 楼 xiaozhuhh 的回复:
已经好了。可是还有个问题,文件每行都是以换行符结尾的,怎么能 不把换行符存进去呢?
手动的把\n赋值为\0

#14


读取完之后,在回车替换成字符串结束符'\0';
如:
while(i < 10 && fgets(content[i], 255, fd)) {
content[i][strlen(content[i])-1] = '\0';
i++;
}

#15


搞定。谢谢各位了!