读入文本分隔文件C

读入文本分隔文件C,c,io,C,Io,仍然在摆弄C。不确定我在这里做错了什么,但我认为这与指针有关。无论如何我正在尝试读入一个以制表符分隔的文本文件,并将其解析为二维数组。实际数组是6109 x 14,我分配了一个更大的指针数组 FILE *in = fopen("afile","rt"); // read the first line from the file char line[2000]; int x=0; int y=0; char *result[7000][14]; char *curResult; char deli

仍然在摆弄C。不确定我在这里做错了什么,但我认为这与指针有关。无论如何我正在尝试读入一个以制表符分隔的文本文件,并将其解析为二维数组。实际数组是6109 x 14,我分配了一个更大的指针数组

FILE *in = fopen("afile","rt");
// read the first line from the file
char line[2000];
int x=0;
int y=0;
char *result[7000][14];
char *curResult;
char delim[]= "\t";

while (fgets(line, 2000, in) != NULL) {
    printf("LINE IS %s\n",line);
    curResult=NULL;
    curResult = strtok(line,delim);
    y=0;
    while( curResult != NULL ) {
        result[x][y]= curResult;
        curResult = strtok( NULL, delim );
        y++;
    }
    x++;
}

//print a random line to check 
for(int i=0; i<10; i++)
    printf("%s\n", result[50][i]);

想象一下,
line
是一个大盒子,你可以在里面放一堆字母。
这就是使用
fgets()
所做的

接下来,您指向该框中的特定字母

接下来,替换框中的内容(另一个
fgets()
到同一个变量
line
),指针当然仍然指向同一个框,但现在指向新的字母


您需要在循环中的某个位置复制字符(使用strcpy(),首先检查是否有足够的空间。

能否显示“文件”的前几行?我试过..我不确定如何格式化复制的文本,不是所有的新行都是新行..我会看看是否能解决这个问题。strok返回take in line的指针。除非是令牌的副本,否则没有意义。或者更明确地说,
strtok()
不会为任何内容分配任何新空间。它只是发出指向其内部状态部分的指针。因此,它返回的内容按原样使用是不安全的。您需要将它返回的内容复制到您控制的内存中。我尝试用strcpy(result[x][y],curResult)替换我的命令result[x][y]=curResult;但是我遇到了一个严重的访问错误。
result[x][y]
指向了哪里?您需要确保您正在复制到有效的地方。我想你的意思是有
charresult[7000][14]
strcpy(结果[x],curResult)。只需确保
currensult
的字符数不超过13个。哦,我明白了。我想。除了我想要一个二维的字符串矩阵?就像我希望结果[5][10]说“josh”或其他什么,而不是每个单元格都包含一个字符。我可以吗?当然可以。要做到这一点,您对
result
的定义有效。。。但是您需要为指针分配内存<代码>结果[x][y]=malloc(strlen(curResult)+1);strcpy(结果[x][y],当前结果)记住
自由(结果[x][y])当您不再需要内存时。
  instance_id   batch_id    cmap_name   INN1    concentration (M)   duration (h)    cell2   array3  perturbation_scan_id    vehicle_scan_id4    scanner vehicle vendor  catalog_number  catalog_name
1   1   metformin   INN 0.00001 6   MCF7    HG-U133A    EC2003090503AA  EC2003090502AA  HP GeneArray Scanner    medium  Sigma-Aldrich   D5035   "1,1-dimethylbiguanide hydrochloride"
2   1   metformin   INN 0.00001 6   MCF7    HG-U133A    EC2003090504AA  EC2003090502AA  HP GeneArray Scanner    medium  Sigma-Aldrich   D5035   "1,1-dimethylbiguanide hydrochloride"
3   1   metformin   INN 0.0000001   6   MCF7    HG-U133A    EC2003090505AA  EC2003090502AA  HP GeneArray Scanner    medium  Sigma-Aldrich   D5035   "1,1-dimethylbiguanide hydrochloride"
4   1   metformin   INN 0.001   6   MCF7    HG-U133A    EC2003090506AA  EC2003090502AA  HP GeneArray Scanner    medium  Sigma-Aldrich   D5035   "1,1-dimethylbiguanide hydrochloride"
21  2   phenformin  INN 0.00001 6   MCF7    HG-U133A    EC2003091104AA  EC2003091102AA  HP GeneArray Scanner    medium  Sigma-Aldrich   P7045   phenformin hydrochloride
22  2   phenyl biguanide        0.00001 6   MCF7    HG-U133A    EC2003091105AA  EC2003091102AA  HP GeneArray Scanner    medium  Sigma-Aldrich   P19906  1-phenylbiguanide hydrochloride
23  2   valproic acid   INN 0.001   6   MCF7    HG-U133A    EC2003091106AA  EC2003091102AA  HP GeneArray Scanner    medium  Sigma-Aldrich   P4543   2-propylpentanoic acid
61  2a  metformin   INN 0.00001 6   MCF7    HG-U133A    EC2003091103AA  EC2003091102AA  HP GeneArray Scanner    medium  Sigma-Aldrich   D5035   "1,1-dimethylbiguanide hydrochloride"