我正在尝试打开用户输入的文本文件并读取此文本文件,但一次打印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;
}
答案 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)
三个问题:
变量count
未初始化,因此它的值不确定,使用它会导致未定义的行为。
致电printf(arr)
将arr
视为字符串,但arr
未终止,这又导致未定义的行为。
count
的增量在循环之外。
要解决前两个问题,必须先将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;
}