- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此代码逐行读取文本文件。但是我需要将这些行放在一个数组中,但是我却做不到。现在我不知何故得到了一系列数字。那么如何将文件读入列表。我尝试使用二维列表,但是效果不佳。
我是C语言的新手。我主要使用Python,但现在我想检查C对于某个任务而言是否更快。
#include <stdio.h>
#include <time.h>
#include <string.h>
void loadlist(char *ptext) {
char filename[] = "Z://list.txt";
char myline[200];
FILE * pfile;
pfile = fopen (filename, "r" );
char larray[100000];
int i = 0;
while (!feof(pfile)) {
fgets(myline,200,pfile);
larray[i]= myline;
//strcpy(larray[i],myline);
i++;
//printf(myline);
}
fclose(pfile);
printf("%s \n %d \n %d \n ","while doneqa",i,strlen(larray));
printf("First larray element is: %d \n",larray[0]);
/* for loop execution */
//for( i = 10; i < 20; i = i + 1 ){
// printf(larray[i]);
//}
}
int main ()
{
time_t stime, etime;
printf("Starting of the program...\n");
time(&stime);
char *ptext = "String";
loadlist(ptext);
time(&etime);
printf("time to load: %f \n", difftime(etime, stime));
return(0);
}
最佳答案
有许多方法可以正确执行此操作。首先,首先要弄清您实际需要/想要存储的内容,然后弄清楚该信息来自何处,最后决定如何为信息提供存储。在您的情况下,显然希望loadlist
加载行列表(最多10000
),以便可以通过静态声明的指针数组进行访问。 (您还可以动态分配指针,但是如果您知道它们不需要多于X
,则静态声明它们就可以了(直到导致StackOverflow的地步...)
读取loadlist
中的行后,则需要提供足够的存储空间来容纳该行(加上nul终止符)。否则,您只是在计算行数。在您的情况下,由于您声明了一个指针数组,因此您不能简单地复制读取的行,因为数组中的每个指针尚未指向任何已分配的内存块。 (您不能使用fgets (buffer, size, FILE*)
分配读取行的缓冲区的地址,因为(1)它是loadlist
函数的本地地址,并且在函数返回时销毁函数堆栈帧时,该地址将消失;以及(2)显然,每次调用fgets
都会覆盖它。
那么该怎么办?这也非常简单,只需使用@iharob所说的使用每行的strlen
为每行分配存储,就像@iharob所说的(+1
为nul-byte),然后malloc
分配一个大小为该大小的内存块。然后,您可以简单地将读取缓冲区复制到创建的内存块中,并将指针分配给您的list
(例如,代码中的larray[x]
)。现在,gnu扩展提供了一个strdup
函数,该函数既可以分配也可以复制,但是要了解它不是C99标准的一部分,因此您会遇到可移植性问题。 (还请注意,如果您担心内存重叠区域,可以使用memcpy
,但是由于您正在从文件中读取行,因此我们暂时将其忽略)
分配内存的规则是什么?好吧,您用malloc
,calloc
或realloc
进行分配,然后在继续操作之前验证对这些函数的调用是否成功,或者您通过写入实际上不是实际的内存区域而进入了未定义行为的领域分配给您使用。看起来像什么?如果您有指针数组p
,并且想要将读取缓冲区buf
中长度为len
的字符串存储在索引idx
处,则可以简单地执行以下操作:
if ((p[idx] = malloc (len + 1))) /* allocate storage */
strcpy (p[idx], buf); /* copy buf to storage */
else
return NULL; /* handle error condition */
p[idx] = malloc (len + 1); /* allocate storage */
if (p[idx] == NULL) /* validate/handle error condition */
return NULL;
strcpy (p[idx], buf); /* copy buf to storage */
PTRMAX
),则可以执行以下操作:
int idx = 0; /* index */
while (fgets (buf, LNMAX, fp) && idx < PTRMAX) {
...
idx++;
}
'\n'
。回想一下,
fgets
最多读取并包括
'\n'
。您不希望换行符悬挂在存储的字符串的末尾,因此您只需用一个以nul结尾的字符覆盖
'\n'
(例如,简单地用十进制
0
或等效的nul字符
'\0'
–您可以选择) )。您可以在
strlen
调用后进行一次简单的测试,例如
while (fgets (buf, LNMAX, fp) && idx < PTRMAX) {
size_t len = strlen (buf); /* get length */
if (buf[len-1] == '\n') /* check for trailing '\n' */
buf[--len] = 0; /* overwrite '\n' with nul-byte */
/* else { handle read of line longer than 200 chars }
*/
...
200
字符的问题。您可以通过检查
fgets
是否包含
'\n'
来检查是否已读取完整行。最后,如果没有,您将知道您对下一个
fgets
的调用将再次从同一行读取,除非遇到
EOF
,在这种情况下,您只需要
realloc
您的存储并附加任何其他内容同一行中的字符-留待以后讨论)
loadlist
选择可以指示成功/失败的返回类型,则可以执行以下操作:
/** read up to PTRMAX lines from 'fp', allocate/save in 'p'.
* storage is allocated for each line read and pointer
* to allocated block is stored at 'p[x]'. (you should
* add handling of lines greater than LNMAX chars)
*/
char **loadlist (char **p, FILE *fp)
{
int idx = 0; /* index */
char buf[LNMAX] = ""; /* read buf */
while (fgets (buf, LNMAX, fp) && idx < PTRMAX) {
size_t len = strlen (buf); /* get length */
if (buf[len-1] == '\n') /* check for trailing '\n' */
buf[--len] = 0; /* overwrite '\n' with nul-byte */
/* else { handle read of line longer than 200 chars }
*/
if ((p[idx] = malloc (len + 1))) /* allocate storage */
strcpy (p[idx], buf); /* copy buf to storage */
else
return NULL; /* indicate error condition in return */
idx++;
}
return p; /* return pointer to list */
}
int
并返回读取的行数,或将指针传递给
int
(或者更好的是
size_t
)作为参数来使存储的行数可用返回调用函数。
NULL
的指针数组中所有指针的初始化,因此回到调用函数中,我们只需要遍历指针数组直到遇到第一个
NULL
即可遍历我们的行列表。放一个简短的示例程序,从程序的第一个参数给出的文件名中读取/存储所有行(最多
PTRMAX
行)(如果未提供文件名,则从
stdin
读取/存储所有行),您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
enum { LNMAX = 200, PTRMAX = 10000 };
char **loadlist (char **p, FILE *fp);
int main (int argc, char **argv) {
time_t stime, etime;
char *list[PTRMAX] = { NULL }; /* array of ptrs initialized NULL */
size_t n = 0;
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
printf ("Starting of the program...\n");
time (&stime);
if (loadlist (list, fp)) { /* read lines from fp into list */
time (&etime);
printf("time to load: %f\n\n", difftime (etime, stime));
}
else {
fprintf (stderr, "error: loadlist failed.\n");
return 1;
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
while (list[n]) { /* output stored lines and free allocated mem */
printf ("line[%5zu]: %s\n", n, list[n]);
free (list[n++]);
}
return(0);
}
/** read up to PTRMAX lines from 'fp', allocate/save in 'p'.
* storage is allocated for each line read and pointer
* to allocated block is stored at 'p[x]'. (you should
* add handling of lines greater than LNMAX chars)
*/
char **loadlist (char **p, FILE *fp)
{
int idx = 0; /* index */
char buf[LNMAX] = ""; /* read buf */
while (fgets (buf, LNMAX, fp) && idx < PTRMAX) {
size_t len = strlen (buf); /* get length */
if (buf[len-1] == '\n') /* check for trailing '\n' */
buf[--len] = 0; /* overwrite '\n' with nul-byte */
/* else { handle read of line longer than 200 chars }
*/
if ((p[idx] = malloc (len + 1))) /* allocate storage */
strcpy (p[idx], buf); /* copy buf to storage */
else
return NULL; /* indicate error condition in return */
idx++;
}
return p; /* return pointer to list */
}
valgrind
是通常的选择。每个平台都有类似的内存检查器。它们都很容易使用,只需通过它运行程序即可。
关于c - C-无法将文本文件中的字符串列表读取并处理到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42032636/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!