如何定义足够长的字符串

黑山虎 2007-07-29 11:09:08
要将文件中一行作为一个字符串来处理,如何定义一行,使它的长度不受限制,
例如若定义了char strLine[1024],那么遇到超过1024个字符的行会出错,如果用指针具体应怎么做,希望能举个例子
...全文
1009 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cceczjxy 2007-07-30
  • 打赏
  • 举报
回复
free(ptr);
ptr=NULL;

这两行挪到循环内
cceczjxy 2007-07-30
  • 打赏
  • 举报
回复
可以使用getline函数,不过该函数不是ANSC c函数,是GNU c里的.

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main()
{
FILE *file;
char *ptr=NULL;
long len=0;
struct stat s_stat;
stat("test.txt",&s_stat);
file=fopen("test.txt","r");
if(!file)return -1;
while((len=getline(&ptr,&(s_stat.st_size),file))>=0) //读一行,最大允许s_stat.st_size(文件大小),空间有函数内动态分配.
{
printf("%s",ptr);
}
free(ptr);
ptr=NULL;
fclose(file);
}
lockhall 2007-07-30
  • 打赏
  • 举报
回复
用string或者容器吧
softwarewander 2007-07-30
  • 打赏
  • 举报
回复
LS的是个办法。
顶!
al_fine 2007-07-30
  • 打赏
  • 举报
回复
这个是C语言的硬伤之一,没有简便的办法。

考察一下输入的文件的每行最大长度是个办法,但是并不能根治你提的问题。

我能想到一个根治的办法,但是很麻烦。就是在堆里动态分配一个缓冲区,然后一个字符一个字符地读。发现字符串太长时,重新分配一个大的缓冲区。这样除非内存用尽,缓冲区不会不够用。

FILE* stream;
char* strLine = malloc (1024);
char* newLine;
int bufLen = 1024;
int ch;
int i = 0;

while (ch = fgetc( stream ), ch != '\n' && ch != EOF)
{
strLine[i++] = ch;
if (i == bufLen)
{
strLine [i] = 0;
bufLen *= 2;
newLine = malloc (bufLen);
strcpy (newLine, strLine);
strLine = newLine;
}
}
jeffer007 2007-07-30
  • 打赏
  • 举报
回复
如果在PC上运行不考虑效率的话(嵌入式的话需要考虑效率),可以先将文件动态的扫描一边,和“al_fine”的方法类似,不过需要修改如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include<climits>

typedef unsigned short USHORT;
typedef unsigned long ULONG;
#define MAXLINE 256

long CountMaxLine()
{
FILE* file_stream;
USHORT ch = 0;
USHORT* strLine;
ULONG bufLen = MAXLINE;
ULONG bufMaxLen = 0;
ULONG curLineNo = 0;
ULONG maxLineNo = 0;
ULONG i = 0;

strLine = (USHORT*)calloc (bufLen+1, sizeof(USHORT));
if (strLine == NULL)
{
exit( 1 );
}
file_stream = fopen("test.txt", "rb");//test.txt is a unicode file.
if (file_stream == NULL)
{
exit( 1 );
}

while ((ch = fgetwc( file_stream ), !feof(file_stream)))
{
if (i == bufLen)
{
USHORT* tmpLine;

tmpLine = (USHORT*)calloc (bufLen+1, sizeof(USHORT));
if (tmpLine == NULL)
{
exit( 1 );
}
//backup buffer
wcscpy(tmpLine, strLine);
//add 1 char size
bufLen++;
strLine = (USHORT*)realloc (strLine, (bufLen+1)*sizeof(USHORT));
if (strLine == NULL)
{
exit( 1 );
}
memset(strLine, 0, (bufLen+1)*sizeof(USHORT));
wcscpy(strLine, tmpLine);

free(tmpLine);
}
strLine[i++] = ch;
if (ch == 0x000a)
{//here is a new line
curLineNo++;
if (bufLen > bufMaxLen)
{//record the max buffer length
bufMaxLen = bufLen+1;
maxLineNo = curLineNo;
}
i = 0;
if (curLineNo < LONG_MAX)
{
printf("curLineNo %d\r", curLineNo);
}
else
{
printf("\ncurLineNo is more than LONG_MAX\n");
}
}
}
fclose(file_stream);
free(strLine);
printf("\nbufMaxLen %d", bufMaxLen);
printf("\nmaxLineNo %d\n", maxLineNo);
return bufMaxLen;
}

int main( void )
{
long max_line = 0;

max_line = CountMaxLine();

return 0;
}

本人已在机器上调试通过。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧