无法打电话工作
我发现这段代码在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函数,使得我有一个数组(rly1f),这是不为空?文件RLY1F存在并且包含数据。我已经成功地打开它以前使用'在线代码'不是一个函数。 谢谢
您遇到的错误是您忘记传递有效的文件名。因此,无论程序崩溃,或fopen
试图打开一个丢弃的名字,并返回NULL
char * RLY1F; // This is not initialized!
RLY1F = "my_file.txt"; // initialize it!
你必须将你的循环打印字符的下一个问题。
您已定义指针char * rly1f[1500];
您读取1个文件并将其存储在所述阵列rly1f[0]
的第一指针但是,当你显示它你显示指针值的阵列作为字符,这是不你想要什么。你应该只是做:
while (n < 1000) {
printf ("%c", rly1f[0][n]);
n++;
}
注:这不会崩溃,但如果文件读取短于1000 (BLUEPIXY建议的递增后的修复程序n
BTW或第一个字符是跳过)
所以做更简单,因为你的字符串是空终止,该数组传递给puts
:
puts(rly1f[0]);
编辑:读取文件时太你有问题。您需要1500字节,但您完全阅读文件。如果文件大于1500字节,则会发生缓冲区溢出。
你必须计算之前分配内存的长度。比如像这(使用stat
将可能是更好的选择):
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
注意额外的参数,它允许你返回的大小以及文件数据。
注:在Windows系统上,文本文件使用\r\n
(CRLF)来界定线,所以所以有少字符分配的尺寸会比(如果你用文本方式阅读的字符数\r\n
转换为\n
更高在你的缓冲区中:一旦你知道了确切的大小来删除未使用的分配空间,你可以考虑一个realloc
)。
。无论如何,如果文件较小,那会打印垃圾。我会编辑它(留下来解释OP错误,否则他会感到困惑) –
另外'n'不能超过'\ 0'的索引。 – BLUEPIXY
这是由读文件函数中的分配所覆盖的:'code = malloc(1500);''''''''''''那么OP会忽略他/她的文件的实际大小! –
'printf(“NULL array”; exit;'could not compile。 – Downvoter
当前'RLY1F'没有做任何事情,它只是一个空的'char *'指针,你需要为它指定文本文件的名字。像'char * RLY1F =“myfile.txt”;' – RoadRunner
注意''rly1f'是一个'char' **指针**的数组,所以'printf(“%c”,rly1f [n]);'是未定义,因为您的格式说明符不匹配。当然是 – Downvoter