如何在C中将文本文件存储到数组中

时间:2015-11-08 11:10:01

标签: c arrays file-io user-input

我正在尝试打开用户输入的文本文件并读取此文本文件,但一次打印60个字符的文本文件,所以我认为为了让我这样做,我需要将文本存储到数组中如果一行超过60个字符,它应该从一个新行开始。但是,当我运行下面的代码时,会显示一条错误消息:C ^ @

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


int main()
{
char arr[]; 
arr[count] = '\0';
char ch, file_name[25];
FILE *fp;

printf("Enter file name: \n");
gets(file_name);

fp = fopen(file_name,"r"); // reading the file

if( fp == NULL )
{
   perror("This file does not exist\n"); //if file cannot be found print       error message
  exit(EXIT_FAILURE);
}

printf("The contents of %s file are :\n", file_name);

while( ( ch = fgetc(fp) ) != EOF ){
arr[count] = ch;
count++;
  printf("%s", arr);}

fclose(fp);
return 0;
}

4 个答案:

答案 0 :(得分:0)

fgetc 始终会读取下一个字符,直到 EOF 。改为使用 fgets()

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

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 
terminating null byte (aq\0aq) is stored after the last character in the 
buffer. 

答案 1 :(得分:0)

三个问题:

  1. 变量count未初始化,因此它的值不确定,使用它会导致未定义的行为

  2. 致电printf(arr)arr视为字符串,但arr未终止,这又导致未定义的行为

    < / LI>
  3. count的增量循环之外。

  4. 要解决前两个问题,必须先将count初始化为零,然后必须在循环后终止字符串:

    arr[count] = '\0';
    

    但是,您的printf(arr)来电仍然非常有问题,如果用户输入了一些printf格式代码,那会怎么样?这就是为什么你应该从不用用户提供的输入字符串调用printf,而只是做

    printf("%s", arr);
    

    如果您读取的文件内容超过59个字符,那么您也会遇到一个非常大的问题,然后您将溢出数组。

答案 2 :(得分:0)

1)您的while循环未正确分隔。在没有{ }块的情况下,指令arr[count] = ch;是唯一被重复的指令。

我认为它应该包括count的增量

while( ( ch = fgetc(fp) ) != EOF )
  {
     arr[count] = ch;
     count++;
     ....
  }

等等(测试柜台等)。

2)没有必要在数组中读取和存储。完全可以在读取后立即传输每个字符,并在需要时添加换行符(新行,超出限制为60)。

答案 3 :(得分:0)

char arr[];无效。您需要指定尺寸。

array[count] = '\0';:count未初始化。

gets(file_name);:获取已弃用且危险。使用另一个函数,如scanf。

请尝试以下代码:

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

int main()
{
    int ch , count = 0;
    char file_name[25];
    FILE *fp;

    printf("Enter file name: \n");
    scanf(" %24s",file_name);

    fp = fopen(file_name,"r"); // reading the file

    if( fp == NULL )
    {
        perror("This file does not exist\n"); //if file cannot be found print       error message
        exit(EXIT_FAILURE);
    }
    fseek(fp, 0L, SEEK_END);
    long sz = ftell(fp);
    fseek(fp, 0L, SEEK_SET);

    char arr[sz];

    while( ( ch = fgetc(fp) ) != EOF )
    {
        if( count < sz )
        {
            arr[count] = ch;
            count++;
        }
    }
    arr[sz] = '\0';
    printf("The contents of %s file are :\n", file_name);
    printf("arr : %s\n",arr);

    fclose(fp);
    return 0;
}