我在Reading a file character by character in C找到了这段代码,它编译并且是我想要使用的。我的问题是我无法正常工作。代码如下:
char *readFile(char *fileName)
{
FILE *file = fopen(fileName, "r");
char *code;
size_t n = 0;
int c;
if (file == NULL)
return NULL; //could not open file
code = malloc(1500);
while ((c = fgetc(file)) != EOF)
{
code[n++] = (char) c;
}
code[n] = '\0';
return code;
}
我不确定如何调用它。目前我使用以下代码来调用它:
.....
char * rly1f[1500];
char * RLY1F; // This is the Input File Name
rly1f[0] = readFile(RLY1F);
if (rly1f[0] == NULL) {
printf ("NULL array); exit;
}
int n = 0;
while (n++ < 1000) {
printf ("%c", rly1f[n]);
}
.....
如何调用readFile函数使得我有一个非NULL的数组(rly1f)?文件RLY1F存在并且其中包含数据。我之前使用'在线代码'而不是函数成功打开了它。 感谢
答案 0 :(得分:1)
您遇到的错误是您忘记传递有效的文件名。因此,程序崩溃,或textToReplace = randint(1990, 2020)
尝试打开已删除的名称并返回fopen
NULL
您将遇到的下一个问题是在您的循环中打印字符。
您已经定义了一组指针char * RLY1F; // This is not initialized!
RLY1F = "my_file.txt"; // initialize it!
您读取1个文件并将其存储在数组char * rly1f[1500];
但是当你显示它时,你将指针值显示为不是你想要的字符。你应该这样做:
rly1f[0]
注意:如果读取的文件小于1000,则不会崩溃但会打印垃圾。
(BLUEPIXY建议while (n < 1000) {
printf ("%c", rly1f[0][n]);
n++;
}
BTW或第一个字符的后增量修正被跳过)
所以更简单,因为你的字符串是nul终止的,将数组传递给n
:
puts
编辑:您在阅读文件时遇到问题。您puts(rly1f[0]);
1500字节,但您完全读取了该文件。如果文件大于1500字节,则会出现缓冲区溢出。
在分配内存之前,您必须计算文件的长度。例如这样(使用malloc
可能是更好的选择):
stat
注意额外参数,它允许您返回大小以及文件数据。
注意:在Windows系统上,文本文件使用char *readFile(char *fileName, unsigned int *size) {
...
fseek(file,0,SEEK_END); // set pos to end of file
*size = ftell(file); // get pos, i.e. size
rewind(file); // set pos to 0
code = malloc(*size+1); // allocate the proper size plus one
(CRLF)来分隔行,因此如果使用文本模式(\r\n
被转换,分配的大小将高于读取的字符数至\r\n
,因此缓冲区中的字符数较少:一旦知道了准确的大小,就可以考虑\n
来削减未使用的已分配空间。