C将文件内容读入字符串数组
我需要将文件的内容加载到两个字符串数组中。我尝试了以下方法,但不起作用。 file.txt包含10条记录,每条记录有两个由空格分隔的字符串值 代码:C将文件内容读入字符串数组,c,C,我需要将文件的内容加载到两个字符串数组中。我尝试了以下方法,但不起作用。 file.txt包含10条记录,每条记录有两个由空格分隔的字符串值 代码: #包括 #包括 #包括 内部主(空){ 字符行[12][20]; 文件*fptr=NULL; int i=0; int-tot=0; fptr=fopen(“file.txt”,“r”); char-arr[20][20]; 而(fgets(生产线、sizeof(生产线)、fptr)){ strcpy(arr[i],行); i++; } tot=i
#包括
#包括
#包括
内部主(空){
字符行[12][20];
文件*fptr=NULL;
int i=0;
int-tot=0;
fptr=fopen(“file.txt”,“r”);
char-arr[20][20];
而(fgets(生产线、sizeof(生产线)、fptr)){
strcpy(arr[i],行);
i++;
}
tot=i;
对于(int i=0;i
基本上你所做的就是从i
word中打印2个字符。当你想打印完整的字符串时,你应该这样做:printf(“%s”,arr[i]);
你说过值是用空格分隔的,所以当你从文件中获取行时,你会将它保存到arr[i]
(如果文件的第一行包含“Hello World”),您的arr[0]将包含“Hello World”),当您要将其拆分为2printf
时,您需要逐字符打印它们,直到空格
编辑:我提醒自己关于函数sscanf
你可以用它从文件数组中获取数据,就像你用键盘输入一样
代码
#包括
#包括
#包括
内部主(空){
字符行[12][20];
char-arr[20][20];
文件*fptr=NULL;
int i=0;
fptr=fopen(“file.txt”,“r”);
如果(!fptr){
printf(“无法打开文件”);
出口(1);
}
而(fgets(*行,尺寸(行,fptr)){
strncpy(arr[i],*行,sizeof(*行));
i++;
}
对于(int j=0;j,如果我理解正确,您正在尝试将数据存储在如下结构中:
{{“line1A”、“line1B”}、{“line2A”、“line2B”}、{“line3A”、“line3B”}
看起来您需要一个数组,其中每个元素由两个数组(字符串)组成,每行一个用于第一个值,另一个用于第二个值
在下面的示例中,我将arrayOfLines
声明为包含12个元素的数组,每个元素有2个字符数组(每行两个值),每个字符串中有20个字符的空间(以NULL结尾的字符数组)
您的代码还存在一些其他问题:
fgets()
的第一个参数应该是char*
——一个指向字符串缓冲区的指针。您的代码以多维字符数组传递
- 您的while循环应该继续,直到fgets返回NULL
- 您需要将每行拆分为多个字符串
- 使用
strcpy()复制字符串时检查缓冲区溢出
在示例代码中,我使用了strtok()
由“
空格字符分隔-您可能需要处理这个问题-strtok可以接受一个字符数组用作分隔符。在示例中,我使用第一个空格字符拆分第一个字符串,第二个字符串由行尾分隔
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
// Array for 12 lines, each with 2 strings, each string max 20 chars
// Adjust values as required.
char arrayOfLines[12][2][20];
FILE *fptr = NULL;
int i = 0;
int tot = 0;
fptr = fopen("file.txt", "r");
// char arr[20][20]; not needed
char line[20];
while(fgets(line, sizeof(line) / sizeof(line[0]), fptr) != NULL)
{
// Rudimentary error checking - if the string has no newline
// there wasn't enough space in line
if (strchr(line, '\n') == NULL) {
printf("Line too long...");
return EXIT_FAILURE;
}
// Split string into tokens
// NB: Check for buffer overruns when copying strings
char *ptr1 = strtok(line, " ");
strcpy(arrayOfLines[i][0], ptr1);
char *ptr2 = strtok(NULL, "\n");
strcpy(arrayOfLines[i][1], ptr2);
i++;
}
tot=i; // Unecessary - just use a different variable in your loop and use i as the upper bound
for (int i=0;i<tot;i++)
{
printf("first value %s\n", arrayOfLines[i][0]);
printf("second value is %s\n", arrayOfLines[i][1]);
printf("\n");
}
return 0;
}
#包括
#包括
#包括
内部主(空)
{
//数组为12行,每行有2个字符串,每个字符串最多20个字符
//根据需要调整值。
char arrayOfLines[12][2][20];
文件*fptr=NULL;
int i=0;
int-tot=0;
fptr=fopen(“file.txt”,“r”);
//字符arr[20][20];不需要
字符行[20];
while(fgets(line,sizeof(line)/sizeof(line[0]),fptr)!=NULL)
{
//基本错误检查-如果字符串没有换行符
//排队的地方不够
if(strchr(第,'\n'行)=NULL){
printf(“行太长…”);
返回退出失败;
}
//将字符串拆分为标记
//注意:复制字符串时检查缓冲区溢出
char*ptr1=strtok(行“”);
strcpy(arrayOfLines[i][0],ptr1);
char*ptr2=strtok(空,“\n”);
strcpy(arrayOfLines[i][1],ptr2);
i++;
}
tot=i;//不必要-只需在循环中使用不同的变量,并使用i作为上限
对于(int i=0;i行的大小是多少?也许可以找出这个问题来理解可以用来将行拆分为字符串的问题。为什么*line
?为什么[12][20]
只使用第一行?
printf("first value %s",arr[i][0]);
printf("second value is %s",arr[i][1]);
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
char line[12][20];
char arr[20][20];
FILE *fptr=NULL;
int i=0;
fptr = fopen("file.txt", "r");
if(!fptr){
printf("cant open file\n");
exit(1);
}
while(fgets(*line, sizeof(line), fptr)){
strncpy(arr[i],*line, sizeof(*line));
i++;
}
for (int j=0;j<i;j++){
printf("%s\n", arr[j]);
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
// Array for 12 lines, each with 2 strings, each string max 20 chars
// Adjust values as required.
char arrayOfLines[12][2][20];
FILE *fptr = NULL;
int i = 0;
int tot = 0;
fptr = fopen("file.txt", "r");
// char arr[20][20]; not needed
char line[20];
while(fgets(line, sizeof(line) / sizeof(line[0]), fptr) != NULL)
{
// Rudimentary error checking - if the string has no newline
// there wasn't enough space in line
if (strchr(line, '\n') == NULL) {
printf("Line too long...");
return EXIT_FAILURE;
}
// Split string into tokens
// NB: Check for buffer overruns when copying strings
char *ptr1 = strtok(line, " ");
strcpy(arrayOfLines[i][0], ptr1);
char *ptr2 = strtok(NULL, "\n");
strcpy(arrayOfLines[i][1], ptr2);
i++;
}
tot=i; // Unecessary - just use a different variable in your loop and use i as the upper bound
for (int i=0;i<tot;i++)
{
printf("first value %s\n", arrayOfLines[i][0]);
printf("second value is %s\n", arrayOfLines[i][1]);
printf("\n");
}
return 0;
}