[英]Data entry into array of character pointers in C
这是我在这里提出的第一个问题,所以如果我不遵循这里的格式规则,请原谅我。 我正在用C编写一个程序,它要求我从文件中读取几行。 我试图将每一行放入一个cstring。 我已经声明了一个名为buf的2D字符数组,用于保存文件中的每一行。 相关代码如下所示
#include <stdlib.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/socket.h>
#include <sys/un.h> /* UNIX domain header */
void FillBuffersForSender();
char buf[5][2000]; //Buffer for 5 frames of output
int main()
{
FillBuffersForSender();
return 0;
}
void FillBuffersForSender(){
FILE *fp;
int line = 0;
char* temp = NULL;
size_t len = 0;
ssize_t read;
fp = fopen("frames.txt", "r");
printf("At the beginning of Fill Buffers loop.\n");
//while ((read = getline(&temp, &len, fp)) != -1){
while(line < 5){
//fprintf(stderr, "Read in: %s\n", temp);
fgets(temp, 2000, fp);
strcpy(buf[line], temp);
line++;
fprintf(stderr, "Line contains: %s.\n", temp);
temp = NULL;
}
while(line != 0){
fprintf(stderr, "Line contains: %s.\n", buf[line]);
line--;
}
}
这条线
strcpy(buf[line], temp);
导致分段错误。 我尝试过这么多种方法,似乎无法让它发挥作用。 我不习惯C,但其任务是在其中编写双向滑动窗口协议。 我一直遇到像这样的超级基本问题! 如果这是在C ++中,我已经完成了。 任何人都可以提供任何帮助都是不可思议的。 谢谢。
temp
需要指向fgets
可以写入的已分配缓冲区。
谈到C,你必须考虑内存。 分配了NULL的点的内存在哪里? 我们如何将某些东西复制到我们没有空间的地方?
在C编程中,错误检查是每个程序的重要组成部分(实际上有时似乎错误处理代码比功能代码更多)。 代码应检查每个函数的返回值,以确保它有效,例如,如果fopen
返回NULL
,则无法打开文件,同样,如果fgets
返回NULL
,则无法读取行。
此外,代码需要自行清理。 例如,当文件指针超出范围时,没有析构函数关闭文件,因此代码需要显式调用fclose
以在文件结束时关闭文件。
最后,请注意许多C库函数都有需要理解和正确处理的怪癖。 您可以通过阅读函数的手册页来了解这些怪癖。 例如, fgets
函数将换行字符\\n
留在它读取的每一行的末尾。 但是文件的最后一行可能没有换行符。 因此,在使用fgets
,最好fgets
换行符。
考虑到所有这些,代码应如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 5
#define MAXLENGTH 2000
static char buffer[MAXLINE][MAXLENGTH];
void FillBufferForSender(void)
{
char *filename = "frames.txt";
FILE *fp;
if ((fp = fopen(filename, "r")) == NULL)
{
printf("file '%s' does not exist\n", filename);
exit(1);
}
for (int i = 0; i < MAXLINE; i++)
{
// read a line
if (fgets( buffer[i], MAXLENGTH, fp ) == NULL)
{
printf("file does not have %d lines\n", MAXLINE);
exit(1);
}
// strip the newline, if any
size_t newline = strcspn(buffer[i], "\n");
buffer[i][newline] = '\0';
}
fclose(fp);
}
int main(void)
{
FillBufferForSender();
for (int i = 0; i < MAXLINE; i++)
printf("%s\n", buffer[i]);
}
注意:有关如何使用strcspn
换行的说明,请参阅此答案 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.