C将文件内容读入字符串数组

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

我需要将文件的内容加载到两个字符串数组中。我尝试了以下方法,但不起作用。 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;
对于(int i=0;i
基本上你所做的就是从
i
word中打印2个字符。当你想打印完整的字符串时,你应该这样做:
printf(“%s”,arr[i]);
你说过值是用空格分隔的,所以当你从文件中获取行时,你会将它保存到
arr[i]
(如果文件的第一行包含“Hello World”),您的arr[0]将包含“Hello World”),当您要将其拆分为2
printf
时,您需要逐字符打印它们,直到空格


编辑:我提醒自己关于函数
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;
}