我有一个问题,在输出时使用此代码将其他所有行都清空。所需的输出是:http://paste.ubuntu.com/1354365/
我得到:http://paste.ubuntu.com/1356669/
有没有人知道为什么我会在其他所有行上获得这些空行?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fp;
FILE *fw;
int main(int argc, char *argv[]){
char buffer[100];
char *fileName = malloc(10*sizeof(char));
char **output = calloc(10, sizeof(char*));
char **outputBuffer = calloc(10, sizeof(char*));
fw = fopen("calvin.txt", "w+");
for(int y = 0; y < 6; y++){
for(int i = 0; i < 10; i ++)
{
output[i] = malloc(100);
}
for(int x = 0; x < 12; x++){
sprintf(fileName,"part_%02d-%02d", x, y);
fp = fopen(fileName, "rb");
if(fp == NULL)
{
printf("Kan ikke åpne den filen(finnes ikke/rettigheter)\n");
}
else if(fp != NULL){
memset(buffer, 0, 100);
for(int i = 0; i < 10; i++){
outputBuffer[i] = malloc(100);
}
fread(buffer, 1, 100, fp);
for(int i = 0; i < 100; i++){
if(buffer[i] == '\0')
{
buffer[i] = ' ';
}
else if(buffer[i] == '\n')
{
buffer[i] = ' ';
}
}
for(int i = 0; i < 10; i++) {
strncpy(outputBuffer[i], buffer + i * 10, 10);
strncat(output[i], outputBuffer[i]+1, 11);
}
}
}
for(int i = 0; i < 10; i++){
printf("%s\n", output[i]);
}
}
fclose(fp);
free(fileName);
}
答案 0 :(得分:0)
您没有从文件中读取更正。在开头的第一张图片上,您有:
o ""oo " o o o
在第二个
""oo o o o
这没有多大意义,因为它是第一线。它与空行无关,因为我们讨论的是第一行。
您似乎正在从左侧读取-2
个字符,因此“打印在另一个上”等字符......
试试这个,可能不是最有效的解决方案:
int read(char *file)
{
FILE *fp = NULL;
int size = 0, pos = 0,i;
fp = fopen(file,"r");
if (!fp) return 0;
for(; ((getc(fp))!=EOF); size++); // Count the number of elements in the file
fclose(fp);
char buffer[size];
fp = fopen(file,"r");
if (!fp) return 0;
while((buffer[pos++]=getc(fp))!=EOF); // Saving the chars into the buffer
for(i = 0; i < pos; i++) // print them.
printf("%c",buffer[i]);
fclose(fp);
return 1;
}
答案 1 :(得分:0)
这部分似乎有问题:
strncpy(outputBuffer[i], buffer + i * 10, 10);
strncat(output[i], outputBuffer[i]+1, 11);
1)为什么有必要使用额外的outputBuffer
步骤?
2)您知道strncpy()
不能保证空终止它复制的字符串。
3)更重要的是,output[i]
尚未初始化,因此strncat()
将在任何垃圾已经存在之后连接字符串。 如果您在创建每个calloc()
时使用malloc()
而不是output[i]
,那可能会有帮助。您的output[i]
变量甚至可能是您的变量额外换行。
4)即使初始化为空字符串,您也可以轻松溢出output[i]
,因为您循环12次并且最多可写入11个字符。空终结符为11 * 12 + 1 =写入100字节数组的133字节。
一般情况下,除非这是一个需要使用malloc()
的类赋值,否则我不明白为什么你不只是在程序开始时将变量声明一次并将它们归零。每个循环的开始:
char fileName[10];
char output[10][100];
char outputBuffer[10][100];
而且,正如其他人所说,你分配一堆内存而不是试图释放它。在循环外部分配一次,或者只是跳过分配步骤并直接声明它们。