iv编写了一部分代码,它基本上将文本从txt文件传输到变量并打印出来(作为程序的一部分),但它根本不打印内容。
#include <stdio.h>
#include <stdlib.h>
#define WRONG_ARGUMENTS (-1)
int Lines(FILE * file);
int Length(FILE * file);
int Read(FILE * file);
int Lines(FILE * file)
{
int c=0,count=0;
++count;
while(c!=EOF)
{
c=fgetc(file);
if(c=='\n')
++count;
}
return count;
}
int Length(FILE * file)
{
int c,count=0;
while((c=fgetc(file))!=EOF)
{
++count;
}
return count;
}
int Reader(FILE * Text,char * File)
{
int counter=0;
while(fscanf(Text,"%s",File)!=EOF)
{
++counter;
strcat(File," ");
}
return counter;
}
int main(int argc,char * argv[]) {
FILE * Text=NULL;
if(argc!=2)
{
printf("usage:library text dictionary\n");
return -1;
}
Text = fopen(argv[1],"r");
if(Text==NULL)
{
printf("file %s could not be opened\n",argv[1]);
return -1;
}
char * File = "";
File=malloc(Length(Text)*(sizeof(char)));
int r = Reader(Text,File);
printf(File);
return 0;
}
我将非常乐意了解部分代码中的问题 输出是x>
感谢,
答案 0 :(得分:1)
考虑以下减少的例子。您会注意到getFileLength
函数(a)实际上没有读取文件中的任何内容,(b)使用fseek
和ftell
函数 - fseek是函数用于在文件指针到达EOF时重新定位文件指针。
想象一下,您没有打印数据,而是使用它做其他事情。如果文件长达十亿字节怎么办?我们肯定不想从中读取1,000,000,000次以确定其长度!
至于calloc的使用 - 它初始化它分配的数据。由于您正在阅读文本,因此您需要确保文本以NULL结尾。 (NULL通常= 0,虽然我已经看到了改变这个的邪恶宏)这个NULL终结符也是我分配比文件包含的多1个字节的原因。
#include <stdio.h>
#include <stdlib.h>
long getFileLength(FILE *input)
{
long result;
long origPos = ftell(input);
fseek(input, 0, SEEK_END);
result = ftell(input);
fseek(input, origPos, SEEK_SET);
return result;
}
int main (void)
{
FILE *fp;
long fileLen, numBytesRead;
char *data;
fp = fopen("main.cpp", "rb");
fileLen = getFileLength(fp);
data = (char*)calloc(sizeof(char), fileLen+1);
numBytesRead = fread(data, sizeof(char), fileLen, fp);
if (numBytesRead != fileLen)
printf("Error reading all bytes from file. Expected: %d, Read %d\n", fileLen, numBytesRead);
else
printf("%s", data);
free(data);
fclose(fp);
}